C# HtmlAlityPack xpath不工作
我有一个问题,我的xpath不工作 我试图在底部找到Google.com下一个链接的url 但我无法使用Xpath访问url 请帮助我更正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
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;你可以把它贴在网上
然而,在此期间,我发现了以下解决方法:
- 查找包含分页元素的表(带有
的表)。对于此元素,可以正确识别idid=“nav”
- 取表中的第一个(也是唯一的
)和最后一个tr
(使用XPathtd
函数)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&hl=en&ie=UTF-8&[...]" 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;我已经更新了我的答案。顺便说一句,谢谢你提供了这个很棒的图书馆!:)