SelectSingleNode 在 foreach 上返回错误的结果

本文关键字:错误 结果 返回 foreach SelectSingleNode | 更新日期: 2023-09-27 18:34:16

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 的结果,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 如果您想尝试自己会发生什么。

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

SelectSingleNode 在 foreach 上返回错误的结果

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

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