HTML Agility Pack - 使用XPath獲取單個節點 - 對象引用未設置為對象的實例

html-agility-pack xpath

這是我第一次嘗試使用HAP獲取元素值。當我嘗試使用InnerText時,我得到一個null對象錯誤。

我正在抓取的網址是: - http://www.mypivots.com/dailynotes/symbol/659/-1/e-mini-sp500-june-2013我想從日變化中獲取當前最高價值匯總表。

我的代碼位於底部。首先,我想知道我是否正確地採用了這種方式?如果是這樣,那麼我的XPath值是不正確的呢?

XPath值是使用我發現的名為htmlagility helper的實用程序獲得的。下面的XPath的firebug版本也給出了同樣的錯誤: - / html / body / div [3] / div / table / tbody / tr [3] / td / table / tbody / tr [5] / td [3 ]

我的代碼: -

WebClient myPivotsWC = new WebClient();
string nodeValue;
string htmlCode = myPivotsWC.DownloadString("http://www.mypivots.com/dailynotes/symbol/659/-1/e-mini-sp500-june-2013");
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(htmlCode);
HtmlNode node = doc.DocumentNode.SelectSingleNode("/html[1]/body[1]/div[3]/div[1]/table[1]/tbody[1]/tr[3]/td[1]/table[1]/tbody[1]/tr[5]/td[3]");
nodeValue=(node.InnerText);

謝謝,威爾。

一般承認的答案

您不能依賴開發工具(如FireBug或Chrome等)來確定您所關注節點的XPATH,因為此類工具提供的XPATH對應於內存HTML DOM而Html Agility Pack只知道服務器發回的原始HTML。

您需要做的是直觀地查看發回的內容(或只是查看源代碼)。你會看到沒有TBODY元素。因此,您希望找到任何區別對象,例如使用XPATH軸 。此外,您的XPATH即使有效,也不會對文檔中的更改產生很大的抵抗力,因此您需要找到更加“穩定”的內容,以便更好地面向未來。

這是一個似乎有用的代碼:

HtmlNode node = doc.DocumentNode.SelectSingleNode("//td[@class='dnTableCell']//a[text()='High']/../../td[3]");

這就是它的作用:

  • 找到一個CLASS屬性設置為'dnTableCell'的TD元素。 //令牌表示搜索在XML層次結構中是遞歸的。
  • 找到包含文本(內部文本)的A元素等於“高”。
  • 導航兩個父母(我們將到達最近的TR元素)
  • 從那裡選擇第3個TD元素

熱門答案

Simon Mourier的說法,你獲得了服務器發送的原始HTML。您需要的元素尚未呈現,因此您無法檢索它,因為它不存在於DOM中。解決這個問題的一個簡單方法是使用Web渲染器來構建DOM,而不是抓取HTML並抓取它。我像這樣使用WatiN

WatiN.Core.Settings.MakeNewInstanceVisible = false;
WatiN.Core.Settings.AutoMoveMousePointerToTopLeft = false; 
IE ie = new IE();
ie.GoTo(urlLink); 
ie.WaitForComplete();
string html = ie.Html;
ie.close();



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因