2012-03-10 18 views
8

XPathの難しさで、誰かがすぐに正しい方向に向けることを願っています。XPathでHTMLテーブルを解析する特定のテキストのセルを見つける

現在、私は自分のHTMLソースに必要な正しいテーブルを特定していますが、DOMのどこかにテキスト「チャプター」がある行だけを処理する必要があります。

私の最後の試みは、これを実行することでした。

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

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

私は「私のどこかにそのDOM内のテキストが含まれている「TD」の次の子要素を持っているすべての要素を取得し、上記のXPathが表すだろうと思いました章」

私のソースからマッチする行の例は次のとおりです。

<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> 

すべてのヘルプ/ポインタは大歓迎します。

おかげで、

答えて

12

使用このXPathの含まれているいずれかのサブ要素を持つすべてのTR/TD取得:

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

動作するようです。何が '。' ?また、私はなぜ「reletive」検出が機能していないのか理解していません。あなたは//私はルートで始まることを理解している? – Dave

+0

@Dave、よろしくお願いします。 '.'と' // 'はXPathの短縮形です。 '.'はコンテキストノードを選択します。 '// td'はドキュメントルートのすべての' td'子孫を選択し、コンテキストノードと同じドキュメント内のすべての 'td'要素を選択します。 *リファレンス*:http://www.w3.org/TR/xpath/#path-abbrev –

2

右手に "パス"。
contains()関数は、特定の要素を制限し、子のテキストを制限しません。次のように読むことができるされ、このXPathを試してみてください: - テキスト 'の章'

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

幸運

+0

こんにちはウィリアム、それを行くを与えたが、得ることができませんでしたそれは何かを返す。最も効果的ではないとは思われますが、 ' def' chapterAnchors = page.anchors.findAll {HtmlAnchor a - > a.asText()。contains( 'Chapter')} ' – Dave

7

あなたは、現在のノードの下にあるすべてのtd秒たい - 現在受け入れ答えSEとして、すべての文書- ないにアクセスします。

使用

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

これは文字列値文字列"Chapter"を含む少なくとも1人のテキストノードの子孫を、持っているtd命名されている現在のノードのすべてのtd子孫を選択します。

この下のいずれかのtdtableは、単一のテキストノードを持っていることを事前に知られている場合、これはちょうど簡素化することができます。

.//td[contains(., 'Chapter')] 
関連する問題