使用HtmlAgilityPack时XPath表达式出现奇怪现象

本文关键字:怪现象 表达式 HtmlAgilityPack XPath 使用 | 更新日期: 2023-09-27 18:16:45

我有一个html文件与两个表,我使用HtmlAgilityPack。HtmlDocument用于检索数据。

我试过使用

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

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

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

我得到了第一个表的行。

我知道它确实看到了第二个表因为如果我尝试

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

我得到count of 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")

使用HtmlAgilityPack时XPath表达式出现奇怪现象

我怀疑这是因为每个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