2011-07-26 57 views
1

我有這樣的XPath表達式不起作用C#htmlagilitypack XPath的幫助

"//div[child[0]::h4[text()[contains(.,'Dir')]]]/a" 

爲了解析這個網站:

<div class="txt"> 
     <h4 class="c1"> 
     Dir 
     </h4> 
    <a href="/name/myname/">Bob</a> 
</div> 

我想獲得在鏈路節點(A)。文檔中還有其他html標籤具有相同的div/h4層次結構,唯一的區別是h4標籤的內文。那麼如何檢查div類(1)是否具有帶有內部文本「dir」的子h4節點以及(2)獲取第一個鏈接節點(a)。不要以爲這個鏈接是h4的下一個兄弟。

+0

你非常接近,但你不能把一個謂語在軸上,所以'孩子[0] ::'不正確。如果你想要'div'的第一個'h4'子元素,你可以使用'// div [child :: h4 [1] [text()[...]]/a',或者只用'// div [ h4 [1] [text()[...]]/a',因爲'child ::'對於元素是隱含的。如果'h4'必須是第一個子元素,然後'// DIV [* [1] /自:: H4 [...]]/A'。 – LarsH

回答

2

難道你不能只用這個xpath?

"//div[h4[contains(text(),'Dir')]]/a" 

child[0]不是有效的軸線AFAIK所以它將失敗。

我不知道這是否能夠滿足您的條件,而不會看到更完整的示例HTML。但是這對這個確實有用。

如果有可能,有在div內的多個h4元素,你只需要檢查的第一個:

"//div[h4[1][contains(text(),'Dir')]]/a" 
+0

注意:我已經假設您將對這些xpath使用'SelectSingleNode()'方法。所以如果有多個'a'元素,這將已經採取了第一個(根據需要)。 –

1

如何檢查DIV類(1)有子H4與內部文本 「目錄」,節點(2)獲得第一個鏈接點(一)

使用:

"//div[@class='txt' and h4[contains(.,'Dir')]]/a[1]" 
+1

同意,除了你可能不需要'h4'之後的'[1]'。或者你是從OP的'child [0] :: h4'推斷出來的? – LarsH

+0

@LarsH你的觀察是_logically_一致的。 'h4'就足夠了,因爲我們把它當作條件使用。 OP要求_a不是第一個。 –