htmlagilitypack xpath无法正常工作

时间:2013-01-31 21:01:32

标签: c# xpath html-agility-pack

我遇到的问题是我的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 );
}

1 个答案:

答案 0 :(得分:4)

这里奇怪的是HtmlAgilityPack无法识别“Next”链接的id属性。

这可能是HtmlAgilityPack中的一个错误;您可以将其发布在HAP Issue Tracker

然而,与此同时,我发现了这个解决方法:

  • 找到包含分页元素的表(带有id="nav"的表)。对于此元素,正确识别id
  • 获取表格中的第一个(仅tr)及其最后一个td(使用XPath last()函数)
  • a元素放在我们在上一步获得的td内。

长话短说,这是代码:

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中的错误; id="pnnext"属性仅在浏览器发出请求时出现(可能取决于 UserAgent 标头值)。从代码执行HttpWebRequest时,这就是“下一步”链接在输出中的显示方式:

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