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

Strange occurrence with XPath expression when using HtmlAgilityPack

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

我试过使用

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

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

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

我得到了第一行 table 就好了。

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

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"))
                       {

                       }
                   }
               }

然后我得到第二行table。

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

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

我怀疑这是因为每个 table 都位于不同的父元素中。在这种情况下,//table[2] 将匹配对应父元素中第 2 个 table 的每个 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>

到select整个文档中的第二个table,在应用索引之前需要将tableselect或括号括起来:

(//table)[2]/tr

xpathtester.com demo