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

don*_*nic 7 xpath html-agility-pack

这是我第一次尝试使用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);
Run Code Online (Sandbox Code Playgroud)

谢谢,威尔.

Sim*_*ier 27

您不能依赖开发工具(如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]");
Run Code Online (Sandbox Code Playgroud)

这就是它的作用:

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