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

标签 xpath html-agility-pack

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

我正在抓取的网址是:-
http://www.mypivots.com/dailynotes/symbol/659/-1/e-mini-sp500-june-2013
我正在尝试从 Day Change Summary Table 中获取当前高点的值。

我的代码在底部。首先,我只想知道我是否以正确的方式进行处理?如果是这样,那么仅仅是我的 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 axes例如。此外,您的 XPATH,即使它有效,也不会对文档中的更改产生很大的抵抗力,因此您需要找到更“稳定”的东西,以使抓取更能适应 future 。

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

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

这是它的作用:
  • 找到一个 CLASS 属性设置为“dnTableCell”的 TD 元素。//标记表示搜索在 XML 层次结构中是递归的。
  • 查找包含等于“High”的文本(内部文本)的 A 元素。
  • 向上导航两个父元素(我们将到达最近的 TR 元素)
  • 从那里选择第三个 TD 元素
  • 关于xpath - HTML Agility Pack - 使用 XPath 获取单个节点 - 未将对象引用设置为对象的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15826875/

    相关文章:

    java - 在java中创建Xpath以根据另一个属性值选择一个属性值

    c# - SelectSingleNode 在 foreach 上返回错误的结果

    c# - 如何在C#中从HtmlTable中提取数据并排列成行?

    c# - Fizzler 和 QuerySelectorAll

    c# - HTMLAgilityPack 加载 AJAX 内容以进行抓取

    java - 为什么我在 Selenium 中的同一个 WebElement 上得到不同的结果?

    python - 如何在 Python 中从 XML/SOAP 中提取数据

    javascript - 在 Firefox 和 Internet Explorer 中使用 XPath 选择 HTML 元素的不同结果

    xml - 如何在不将重复空格替换为单个空格的情况下修剪 XSLT 中的空格?

    c# - HTML 敏捷包