HTML Agility Pack - 使用XPath获取单个节点 - 对象引用未设置为对象的实例

时间:2013-04-05 05:52:35

标签: xpath html-agility-pack

这是我第一次尝试使用HAP获取元素值。当我尝试使用InnerText时,我得到一个空对象错误。

我正在抓取的网址是: -     http://www.mypivots.com/dailynotes/symbol/659/-1/e-mini-sp500-june-2013 我试图从日更改汇总表中获取当前高点的值。

我的代码位于底部。首先,我想知道我是否正确地采取了这种方式?如果是这样,那么我的XPath值是不正确的呢?

XPath值是使用我发现的名为htmlagility helper的实用程序获得的。下面的XPath的firebug版本也给出了同样的错误: -     / HTML /体/格[3] / DIV /表/ tbody的/ TR [3] / TD /表/ 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);

谢谢, 将

2 个答案:

答案 0 :(得分:26)

你不能依赖开发工具,如FireBug或Chrome等......来确定你所追求的节点的XPATH,因为这些工具给出的XPATH对应于内存中的HTML DOM,而Html Agility Pack只知道服务器发回的原始HTML。

您需要做的是直观地查看发回的内容(或只是查看源代码)。你会看到没有TBODY元素。所以你想找到任何有区别的东西,例如使用XPATH axes。此外,您的XPATH即使有效,也不会对文档中的更改产生很大的抵抗力,因此您需要找到更加“稳定”的内容,以便更好地面向未来。

这是一个似乎有用的代码:

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

这就是它的作用:

  • 找到一个CLASS属性设置为'dnTableCell'的TD元素。 //令牌意味着搜索在XML层次结构中是递归的。
  • 找到包含文本(内部文本)的A元素等于“高”。
  • 导航两个父母(我们将到达最近的TR元素)
  • 从那里选择第3个TD元素

答案 1 :(得分:2)

喜欢 Simon Mourier explaind,你获得了服务器发送的原始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();