2010-05-20 66 views
12

我試圖使用HtmlAgilityPack從包含在聲明爲<div class='content'>的div中的頁面中提取所有鏈接但是,當我使用下面的代碼時,我只是簡單地獲取所有整個頁面上的鏈接。這對我來說並沒有什麼意義,因爲我從前面選擇的子節點調用SelectNodes(在調試器中查看時只顯示特定div的HTML)。所以,每當我調用SelectNodes時,它就像回到根節點。我使用的代碼如下:使用HtmlAgilityPack選擇僅在特定DIV中的項目

HtmlWeb hw = new HtmlWeb(); 
HtmlDocument doc = hw.Load(@"http://example.com"); 
HtmlNode node = doc.DocumentNode.SelectSingleNode("//div[@class='content']"); 
foreach(HtmlNode link in node.SelectNodes("//a[@href]")) 
{ 
    Console.WriteLine(link.Value); 
} 

這是預期的行爲?如果是這樣,我怎麼才能做到我所期望的呢?

回答

18

這將工作:

node.SelectNodes("a[@href]") 

此外,您還可以在一個單一的選擇做到這一點:

doc.DocumentNode.SelectSingleNode("//div[@class='content']//a[@href]") 

另外,請注意link.Value不是爲HtmlNode定義的,所以你的代碼沒有按」編譯。

+0

這看起來不正確的XPath我知道,但它的工作原理。我也會承認我剛剛第一次使用HtmlAgilityPack來回答這個問題。我找不到任何文檔... – Kobi 2010-05-20 17:48:26

+1

關於link.Value,我是從內存中重寫這......它是prob InnerHtml或什麼的。 //是否使它總是回到根?我沒有從W3C – 2010-05-20 18:08:17

+0

的XPath文檔中得到這樣的印象......無論如何,你是對的 - XPath以'//開始就我所知,應該尊重它的上下文。 – Kobi 2010-05-20 19:04:37

相關問題