繁体   English   中英

XPath在HtmlAgilityPack C#中不起作用

[英]XPath not working in HtmlAgilityPack C#

我正在尝试分析此网页http://www.aliexpress.com/wholesale?site=glo&SearchText=watch&page=1并获取所有手表。 但是,我尝试使用HTMLAgilityPack尝试了十多个不同的XPath,但我只能抓取4个产品链接(应为36个左右)。

    WebClient client = new WebClient();
        client.Headers[HttpRequestHeader.UserAgent] = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36";
    var html = client.DownloadString(currentUrl);
    var document = new HtmlDocument();

    document.LoadHtml(html);

     var links = doc.DocumentNode.SelectNodes("//div[@class='item']//a").Select(a => a.Attributes["href"].Value).Distinct();

我尝试了很多不同的XPath,似乎没有任何效果,即使“ // a [@href]”也无法解析所有产品,但有趣的是,我只能看到其中的4个链接。

我重新检查了它正在加载的html,我可以看到更多的产品。 那是什么问题呢? 是HtmlAgilityPack的问题吗? 有人可以帮忙吗,我现在为此苦苦挣扎了三天...

注意 :我已针对http://www.aliexpress.com/wholesale?site=glo&SearchText=watch&page=1对此进行了测试

这不是与HTMLAgility包或XPath相关的问题。 这里的问题是该网站正在使用一种称为handlebar js的东西来实现某种类型的延迟加载。 要记住的一件事是, WebClient不是Web浏览器。 也就是说, WebClient检索服务器发送的静态HTML响应,并且不执行任何JavaScript,而浏览器则执行。

如果检查从服务器获取的原始HTML响应,则<ul class="util-clearfix son-list util-clearfix" id="hs-below-list-items">元件:

<ul class="util-clearfix son-list util-clearfix" id="hs-below-list-items">
    <!-- each li here is the ancestor of an anchor tag that you're hoping to scrape -->
    <li qrdata="200214047|32341478696|cn1513149702"  class="list-item list-item-first ">... </li>
    <li qrdata="200214047|32259964358|ali900189121"  class="list-item list-item-first ">...</li>
    <li qrdata="200214021|32388460600|cn1000737283"  class="list-item list-item-first ">..</li>
    <li qrdata="200214007|32400985609|cn1513217672"  class="list-item list-item-first ">...</li>
</ul>

之后,还有一个脚本块,其余项目位于其中:

<script type="text/x-handlebars-template" id="lazy-render" class="lazy-render">
    <li qrdata="200214007|32390805633|cn111508265"  class="list-item   ">
    ....
</script>

HtmlDocument对象中加载Raw HTML时,会将<script>元素内的内容视为NodeType.Text 这就是为什么您没有获得想要的结果的原因。

也就是说,这是一种解决方法:

var links = document.DocumentNode.SelectNodes("//a[@class='picRind history-item ']|//a[@class='picRind history-item j-p4plog']").Select(a => a.Attributes["href"].Value).Distinct();
foreach (var link in links)
{
    Console.WriteLine(link);
}

var lazyContent = new HtmlDocument();
lazyContent.LoadHtml(document.DocumentNode.SelectNodes("//script[@id='lazy-render']").First().ChildNodes[0].InnerHtml);
var lazyLinks = lazyContent.DocumentNode.SelectNodes("//a[@class='picRind history-item ']|//a[@class='picRind history-item j-p4plog']")
                .Select(a => a.Attributes["href"].Value)
                .Distinct();

foreach (var link in lazyLinks)
{
    // Prints the remaining 36 product links
    Console.WriteLine(link);
}

解决方案中,我们要做的是获取脚本块,并将其视为新文档,然后清除其余的产品链接。

Yahoo具有新格式,在使用HAP XPath时会导致错误。 例如,HAP无法解析“统计信息”选项卡中的数据。 请尝试以下链接: http : //finance.yahoo.com/quote/IBM/key-statistics以获取Price / Book(mrq)数据。 HAP无法解析..section数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM