2012-05-15 75 views
4
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个项目的结果。SelectSingleNode返回错误的结果在foreach

当我进入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如果你想尝试看看自己会发生什么。

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

回答

9

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

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

+0

但是数据节点只有foreach项是错的吗?因为当我使用data.InnerHtml时,它确实显示了它内部的确切数据,并且没有我从数据节点单独选择的项目的重复。 – Guapo

+0

以“//”开头表示您不是在数据中搜索,而是在data.OwnerDocument中搜索。 data.OwnerDocument对于所有数据节点都是一样的。 – hvd

+0

谢谢你解释,现在更有意义! – Guapo