我有一个包含两个表的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")
答案 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
强>