SelectSingleNode 在 foreach 上返回错误的结果

Posted

技术标签:

【中文标题】SelectSingleNode 在 foreach 上返回错误的结果【英文标题】:SelectSingleNode returns the wrong result on a foreach 【发布时间】:2012-05-22 20:40:36 【问题描述】:
htmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(content);

var nodes = doc.DocumentNode.SelectNodes("//div[@class=\"noprint res\"]/div");
if (nodes != null)

    foreach (HtmlNode data in nodes)
    
                  // Works but not what I want
                  MessageBox.Show(data.InnerHtml);

                  // Should work ? but does not ?
                  MessageBox.Show(data.SelectSingleNode("//span[@class=\"pp-place-title\"]").InnerText);
    

我正在尝试解析 HTML 的结果,foreach 的初始节点按预期工作,并为我提供了 10 个符合我需要的项目的结果。

当我进入 foreach 时,如果我输出数据项的内部 html,它会显示正确的数据,但如果我输出 SelectSingleNode,它将始终显示来自 foreach 第一项的数据,就是这样正常行为还是我做错了什么?

为了解决这个问题,我必须在 foreach 中为每个数据项创建一个新的 html,如下所示:

HtmlAgilityPack.HtmlDocument innerDoc = new HtmlAgilityPack.HtmlDocument();
innerDoc.LoadHtml(data.InnerHtml);

// Select what I need
MessageBox.Show(innerDoc.DocumentNode.SelectSingleNode("//span[@class=\"pp-place-title\"]").InnerText);

然后我得到正确的每项数据。

如果您想尝试看看自己会发生什么,我尝试从中获取数据的页面是 http://maps.google.com/maps?q=consulting+loc:+US。

基本上我正在阅读公司名称的左侧列,并且发生了上述情况。

【问题讨论】:

【参考方案1】:

通过以// 开头的XPath 表达式,您将在包含data 节点的整个文档中进行搜索。

您应该能够使用".//[...]" 仅检查data 内的节点。

【讨论】:

但是数据节点只有foreach项是不是错了?因为当我使用 data.InnerHtml 时,它会显示其中的确切数据,并且我从数据节点中选择的项目没有重复。 以“//”开头表示您不是在数据中搜索,而是在 data.OwnerDocument 中搜索。 data.OwnerDocument 对于所有数据节点都是相同的。

以上是关于SelectSingleNode 在 foreach 上返回错误的结果的主要内容,如果未能解决你的问题,请参考以下文章

解析xml文件 selectSingleNode取不到节点(转)

C# Html 敏捷包 ( SelectSingleNode )

C#/XML:XPathNavigator.SelectSingleNode() 始终返回 null

Html Agility Pack SelectSingleNode 在迭代中总是给出相同的结果?

selectnodes和selectSingleNode

获取 xml 节点值尝试使用 SelectSingleNode 和 SelectNodes 使用 c#