2012-05-15 136 views
4
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); 
doc.LoadHtml(content); 

var nodes = doc.DocumentNode.SelectNodes("//div[@class=\"noprint res\"]/div"); 
if (nodes != null) 
{ 
    foreach (HtmlNode data in nodes) 
    { 
        // Works but not what I want 
        MessageBox.Show(data.InnerHtml); 

        // Should work ? but does not ? 
        MessageBox.Show(data.SelectSingleNode("//span[@class=\"pp-place-title\"]").InnerText); 
    } 
} 

我想解析一個HTML的結果,foreach的初始節點,正如預期的那樣工作,並給出了匹配我需要的10個項目的結果。SelectSingleNode返回錯誤的結果在foreach

當我進入foreach時,如果我輸出數據項的內部html,它會顯示正確的數據,但是如果我輸出SelectSingleNode它將始終顯示來自foreach的第一項的數據,是正常的行爲還是我做錯了什麼?

爲了解決這個問題,我不得不創建的foreach內一個新的HTML像這樣每個數據項:

HtmlAgilityPack.HtmlDocument innerDoc = new HtmlAgilityPack.HtmlDocument(); 
innerDoc.LoadHtml(data.InnerHtml); 

// Select what I need 
MessageBox.Show(innerDoc.DocumentNode.SelectSingleNode("//span[@class=\"pp-place-title\"]").InnerText); 

然後我得到每個項目的數據正確。

我試圖從中獲取數據的頁面是http://maps.google.com/maps?q=consulting+loc:+US如果你想嘗試看看自己會發生什麼。

基本上我正在閱讀公司名稱的左側欄,發生上述情況。

回答

9

通過啓動XPath表達式//,您可以搜索包含data節點的整個文檔。

您應該能夠使用".//[...]"來檢查data內的節點。

+0

但是數據節點只有foreach項是錯的嗎?因爲當我使用data.InnerHtml時,它確實顯示了它內部的確切數據,並且沒有我從數據節點單獨選擇的項目的重複。 – Guapo

+0

以「//」開頭表示您不是在數據中搜索,而是在data.OwnerDocument中搜索。 data.OwnerDocument對於所有數據節點都是一樣的。 – hvd

+0

謝謝你解釋,現在更有意義! – Guapo