使用HtmlAgilityPack

时间:2015-10-08 18:20:04

标签: c# xpath html-agility-pack

我有一个包含两个表的html文件,我使用HtmlAgilityPack.HtmlDocument来检索数据。

我尝试使用

htmldoc.DocumentNode.SelectNodes("//table[2]/tr")

访问第二个表的行,但我得到null值。如果我做

htmldoc.DocumentNode.SelectNodes("//table[1]/tr")

我得到了第一张表的行。

我知道它确实会看到第二张桌子,因为如果我尝试

htmldoc.DocumentNode.SelectNodes("//table")

我数到2

但如果我这样做:

 if (htmldoc.DocumentNode.SelectNodes("//table") != null)
               {
                   if (htmldoc.DocumentNode.SelectNodes("//table").Count == 2)
                   {
                       var table = htmldoc.DocumentNode.SelectNodes("//table")[1];
                       foreach (HtmlNode row in table.SelectNodes(".//tr"))
                       {

                       }
                   }
               }

然后我得到第二张表的行。

我的问题是为什么我无法在一个XPath表达式中获取正确的表:

htmldoc.DocumentNode.SelectNodes("//table[1]/tr")

1 个答案:

答案 0 :(得分:1)

我怀疑是因为每个table都位于不同的父元素中。在这种情况下,//table[2]将匹配相应父元素中第二个表的每个table元素,例如:

<root>
    <parent>
        <table>ignored</table>
        <table>this will be selected</table>
    </parent>
    <parent>
        <table>ignored</table>
        <table>this will be selected</table>
    </parent>
</root>

要在整个文档中选择第二个表,您需要在应用索引之前将表选择器包装在括号中:

(//table)[2]/tr

<强> xpathtester.com demo