HTMLAgilityPack XPath不起作用

3
我有一个问题,我的xpath无法正常工作。
我正在尝试获取Google.com底部下一页链接的网址。
但是我无法使用XPath访问到该网址。
请帮我纠正我的XPath。还要告诉我??应该放什么。
HtmlWeb hw = new HtmlWeb();

HtmlAgilityPack.HtmlDocument doc = hw.Load("http://www.google.com/search?q=seo");
HtmlNodeCollection linkNodes = doc.DocumentNode.SelectNodes("//*[@id='pnnext']");

foreach (HtmlNode linkNode in linkNodes)
{
    HtmlAttribute link = linkNode.Attributes["href"];
    MessageBox.Show(link.Value );
}

XPath看起来没问题。我没有看到任何?? - MiMo
但它没有返回任何结果。 - Suresh Sharma
是的,linknodes 为 null。 - Suresh Sharma
1个回答

4
这里的奇怪之处在于,HtmlAgilityPack不会识别“下一页”链接的id属性,可能是HtmlAgilityPack的一个bug,你可以在HAP Issue Tracker上发布它。然而,在此期间,我找到了这个解决方法:
  • 找到包含分页元素的表(id为nav的表),这个元素的id被正确地识别
  • 选择表中的第一个(且唯一的)tr和它的最后一个td(使用XPath中的last()函数)
  • 选择我们在上一步获得的td内的a元素。
简而言之,以下是代码:
var doc = new HtmlWeb().Load("http://www.google.com/search?q=seo");

var nextLink = doc.DocumentNode
    .SelectSingleNode("//table[@id='nav']/tr/td[last()]/a");

Console.WriteLine(nextLink.GetAttribute("href", "err"));

更新

在Simon的评论后,我再次检查了这个问题,结论是HTML Agility Pack并没有bug;只有当通过浏览器发出请求时(也许取决于UserAgent头值),id="pnnext"属性才存在。当从代码中使用HttpWebRequest时,"下一页"链接将以以下方式显示:

<a href="/search?q=seo&amp;hl=en&amp;ie=UTF-8&amp[...]" style="text-align:left">

只是想指出,建议使用.GetAttribute("href", "error")而不是.Attributes["href"].Value - Oscar Mederos
1
如果在浏览器中查看源代码,您会看到一个带有“pnnext”的ID,但是在从http://www.google.com/search?q=seo获取的结果中没有“pnnext” ID(由于某种谷歌神秘原因)。这就解释了为什么找不到它。这不是一个错误。 - Simon Mourier
@SimonMourier,更奇怪的是:只有在通过浏览器进行请求时,id属性才存在(我用Chrome和Fiddler进行了检查)。 因此,这不是HAP中的错误。 我已更新我的答案。 顺便说一句,非常感谢您开发了这个伟大的库! :) - Cristian Lupascu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接