XPATH如何使用HTML敏捷包从HTML中的tbody一次提取一个td

时间:2011-03-05 11:39:23

标签: html html-agility-pack xpath

我正在尝试从下面的网址(Google财经)中解析表格

http://www.google.com/finance/historical?q=BOM:533278

我正在尝试仅提取关闭列中的关闭值。但是当我尝试使用XPATH

hd.DocumentNode.SelectSingleNode("//td[@class='rgt']")

我在一个 Node.innerText 本身中获得了将属性作为类和属性值作为rgt的所有节点。

我需要一个接一个的值,而不是所有的值。我必须在这里做些傻事。谢谢。

使用Firebug找到的实际XPath是以下

/html/body/div/div/div[3]/div[2]/div/div[2]
     /div[2]/div/form/div[2]/table/tbody/tr[2]/td[5]

但是有些如何在form标签之后... HTMLagility包返回null节点。从来没有想过要花这么长时间才能实现。

3 个答案:

答案 0 :(得分:2)

如果您使用 Firebug 或任何 Firefox 扩展程序(例如 XPather )来获取XPath元素需要解析,您可能需要从XPath中删除tbody标记。

在SO上查看以下答案:Why does firebug add <tbody> to <table>?

如果您使用的是 HtmlAgilityPack ,则 Firebug 返回的XPath或与 Firefox 相关的任何其他工具可能会有所不同,因为您正在解析的 HTML源代码可能与Firefox中的HTML源代码不同。

有时在 Internet Explorer 8 中打开同一页面并使用开发人员工具(F12)执行与Firebug相同的操作可能会有用,或者如果没有,使用可以从HtmlAgilityPack page

下载的 HAP Explorer 等其他工具

答案 1 :(得分:0)

关闭列中第一个单元格的XPath为//div[@id='prices']/table/tbody/tr[2]/td[5],第二个单元格的XPath为//div[@id='prices']/table/tbody/tr[3]/td[5],依此类推。

答案 2 :(得分:0)

有很多方法可以做到这一点。这是一个解决方案,它基于Data td(与'lm'类一起):

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
... load the doc ...

foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//td[@class='lm']/../td[5]"))
{
    Console.WriteLine("node=" + node.InnerText);
}