SelectSingleNode在foreach上返回错误的结果

时间:2012-05-15 10:39:50

标签: c# .net-4.0 html-parsing html-agility-pack

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 个答案:

答案 0 :(得分:12)

通过使用//启动XPath表达式,您将搜索包含data节点的整个文档。

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