我遇到的问题是我的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 );
}
答案 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&hl=en&ie=UTF-8&[...]" style="text-align:left">