使用 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
我有一个包含两个 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