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