C# HtmlAlityPack xpath不工作

C# HtmlAlityPack xpath不工作,c#,xpath,html-agility-pack,C#,Xpath,Html Agility Pack,我有一个问题,我的xpath不工作 我试图在底部找到Google.com下一个链接的url 但我无法使用Xpath访问url 请帮助我更正xpath。也告诉我应该在什么地方 HtmlWeb hw = new HtmlWeb(); HtmlAgilityPack.HtmlDocument doc = hw.Load("http://www.google.com/search?q=seo"); HtmlNodeCollection linkNodes = doc.DocumentNode.Sele

我有一个问题,我的xpath不工作

我试图在底部找到Google.com下一个链接的url

但我无法使用Xpath访问url

请帮助我更正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 );
}
奇怪的是,HtmlAgilityPack不知何故无法识别“Next”链接的
id
属性

这可能是HtmlAgilityPack中的一个bug;你可以把它贴在网上

然而,在此期间,我发现了以下解决方法:

  • 查找包含分页元素的表(带有
    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敏捷包中的错误;
id=“pnnext”
属性仅在浏览器发出请求时才存在(可能取决于UserAgent标头值)。从代码执行
HttpWebRequest
时,“下一步”链接显示在输出中:

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


XPath似乎还可以。我没有看到任何
但是它没有返回任何结果,linknodes为空只是为了指出,建议使用
.GetAttribute(“href”,“error”)
而不是
.Attributes[“href”]。Value
如果在浏览器中查看源代码,您将看到一个带有“pnnext”的id,但是从GET-from保存的结果中没有“pnnext”id(出于某些谷歌神秘的原因)。这就解释了为什么没有找到它。这不是一个bug。@SimonMourier它变得更奇怪了:
id
属性只有在通过浏览器完成请求时才会出现(我用Chrome&Fiddler检查过)。所以,它在HAP中没有bug;我已经更新了我的答案。顺便说一句,谢谢你提供了这个很棒的图书馆!:)