htmlagilitypack xpath不正确

时间:2013-01-30 20:09:39

标签: c# xpath html-agility-pack

我有一个问题,我的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));

        }
    }
}

2 个答案:

答案 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);
}

但有一点需要注意:一些链接被修剪(你会在中间看到...