2012-03-10 11 views
8

Birisi, XPath zorluklarım ile hızlı bir şekilde beni doğru yönde yönlendirebilir.Belirli bir metnin HTML tablolarını ayrıştırılmasıyla bir hücreyi bulmak için XPath

Güncel HTML kaynağımda ihtiyacım olan doğru tabloyu tanımladığım noktaya geldim, ancak daha sonra DOM'ta bir yerde 'Bölüm' metnine sahip satırları işlemem gerekiyor.

Benim son girişimi bunu idi: Ben xpath yukarıda beni bir yere kendi dom metin "içerir 'td' bir aşağıdaki alt öğesi olan tüm öğelerini almak, temsil edeceğini düşündü

// get the correct table 
HtmlTable table = page.getFirstByXPath("//table[2]"); 

// now the failing bit.... 
def rows = table.getByXPath("*/td[contains(text(),'Chapter')]") 

Bölüm'

benim kaynağından eşleşen bir satırın bir örnek:

<tr valign="top"> 
    <td nowrap="" align="Right"> 
    <font face="Verdana"> 
    <a href="index.cfm?a=1">Chapter 1</a> 
    </font> 
    </td> 
    <td class="ChapterT"> 
    <font face="Verdana">DEFINITIONS</font> 
    </td> 
    <td>&nbsp;</td> 
</tr> 

Herhangi bir yardım/işaretçiler büyük takdir.

Teşekkürler,

cevap

12

bunu kullanın XPath içeren herhangi bir alt öğe ile:

//td[contains(., 'Chapter')] 
+0

Teşekkürler işe yarayacak gibi görünüyor. Ne yapar '.' temsil etmek? Ayrıca, 'yeniden' algılamanın neden çalışmadığını anlamıyorum. Anladığım kadarıyla, kökten başlamak anlamına gelir? – Dave

+0

@Dave, Rica ederim. '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '.' bağlamsal düğümü seçer. // td, belge kökünün tüm 'td' soyunu seçer ve böylece bağlamsal düğüm ile aynı belgede bulunan 'td' öğelerini seçer. * Referans *: http://www.w3.org/TR/xpath/#path-abbrev –

2

Doğru "yol" üzerinizde.
İçerme() işlevi, alt öğelerin herhangi birinde değil, belirli bir öğeyle sınırlıdır. aşağıdaki gibi okuyabilir, hangi bu XPath deneyin: - get her tr/td metin 'Bölüm'

tr/td[contains(*,"Chapter")] 

İyi şanslar

+0

Merhaba William, gitmek verdi ama alamadım bir şey döndürmek için. Ne işe yaradı, en verimli görünmüyor olsa da ' def bölümAnchors = page.anchors.findAll {HtmlAnchor a -> a.asText(). Tek bir liner' içerir '(' Bölüm ')}' – Dave

7

Eğer mevcut düğümün altındaki tüm td s istiyoruz - belgenin se şu anda kabul cevap olarakyılında tüm - değil.

Kullanım:

.//td[.//text()[contains(., 'Chapter')]] 

Bu dize değeri dize "Chapter" içeren en az bir metin düğümü soyundan sahip td adlandırılır geçerli düğümün tüm td astsallarını. table altında herhangi bir td sadece tek bir metin düğümü olduğunu önceden biliniyorsa

, bu sadece için basitleştirilmiş olabilir:

.//td[contains(., 'Chapter')] 
İlgili konular