Html Agility Pack中的XPath表达式问题

时间:2012-08-28 17:32:13

标签: xpath html-agility-pack

我正在使用Html Agility Pack对Google搜索结果进行基本的网页抓取。作为XPath的新手,我确保我的路径表达是正确的(在FirePath的帮助下)。但是,返回的HtmlNodeCollection始终为NULL。

HtmlWeb web = new HtmlWeb();
HtmlAgilityPack.HtmlDocument htmlDoc = web.Load("http://www.google.com/search?num=10&q=Hello+World");

// get search result URLs
var items = htmlDoc.DocumentNode.SelectNodes("//div[@id='ires']/ol[@id='rso']/li/div[@class='vsc']/h3/a/@href");

foreach (HtmlNode node in items)
{
    Console.WriteLine(node.Attributes);
}

我错过了什么吗?有人可以赐教我吗?

提前致谢,

1 个答案:

答案 0 :(得分:0)

HAP只能处理从网址返回的原始HTML,它不会运行页面上的任何其他javascript或诸如此类的东西。您需要相应地调整查询。

在原始HTML中,ires div存在,但在运行javascript之前,rso不会插入,因此您无法获得任何结果。此处还有其他转换,您也必须进行调整。

以下是HTML的一个片段:

<div id="ires">
    <ol>
        <li class="g">
            <h3 class="r">
                <a href="...">...</a>

用于此目的的更合适的xpath是:

var xpath = "//li[contains(concat(' ',@class,' '),' g ')]" +
            "/h3[contains(concat(' ',@class,' '),' r ')]" +
            "/a/@href";

使用li类找到所有g更容易,因为这些对应于所有结果。您需要使用h3类过滤所有r,否则您将包含其他结果(例如图像结果)。