【问题标题】:XPath Expression Issue in Html Agility PackHtml Agility Pack 中的 XPath 表达式问题
【发布时间】:2012-08-28 17:32:12
【问题描述】:

我正在使用 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);
}

我错过了什么吗?哪位大神可以赐教一下?

提前致谢,

【问题讨论】:

    标签: xpath html-agility-pack


    【解决方案1】:

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

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

    这是 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";
    

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

    【讨论】:

    • 你摇滚,杰夫。非常感谢。
    猜你喜欢
    • 2013-02-13
    • 1970-01-01
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-13
    • 1970-01-01
    相关资源
    最近更新 更多