我有一个问题,我的xpath无法正常工作。
我正在尝试将Google.com搜索结果列表中的网址添加到字符串列表中。
但我无法使用Xpath访问网址。
请帮我纠正我的xpath。还告诉我应该在哪个地方?
HtmlWeb hw = new HtmlWeb();
List<string> urls = new List<string>();
HtmlAgilityPack.HtmlDocument doc = hw.Load("http://www.google.com/search?q=" +txtURL.Text.Replace(" " , "+"));
HtmlNodeCollection linkNodes = doc.DocumentNode.SelectNodes("//div[@class='f kv']");
foreach (HtmlNode linkNode in linkNodes)
{
HtmlAttribute link = linkNode.Attributes["?????????"];
urls.Add(link.Value);
}
for (int i = 0; i <= urls.Count - 1; i++)
{
if (urls.ElementAt(i) != null)
{
if (IsValid(urls.ElementAt(i)) != true)
{
grid.Rows.Add(urls.ElementAt(i));
}
}
}
答案 0 :(得分:1)
网址似乎位于所选cite
下的div
元素中,因此选择它们的XPath为//div[@class='f kv']/cite
。
现在,由于这些包含标记但您只需要文本,因此请选择所选节点的InnerText
。请注意,这些不以http://
开头。
HtmlNodeCollection linkNodes =
doc.DocumentNode.SelectNodes("//div[@class='f kv']/cite");
foreach (HtmlNode linkNode in linkNodes)
{
HtmlAttribute link = linkNode.InnerText;
urls.Add(link.Value);
}
答案 1 :(得分:0)
正确的XPath是"//div[@class='kv']/cite"
。您在浏览器元素检查器中看到的f
类(可能)在使用javascript呈现页面后添加。
此外,链接文本不在属性中,您可以使用在前一步获得的InnerText
元素的<div>
属性来获取它。
我改变了这些行并且它有效:
var linkNodes = doc.DocumentNode.SelectNodes("//div[@class='kv']/cite");
foreach (HtmlNode linkNode in linkNodes)
{
urls.Add(linkNode.InnerText);
}
但有一点需要注意:一些链接被修剪(你会在中间看到...
)