不能使用c#/ htmlilitpack从amazon.com获取适当的信息

本文关键字:获取 com 信息 amazon htmlilitpack 不能 | 更新日期: 2023-09-27 17:52:46

我想获得书籍信息,如作者姓名/页数/出版年份等…从亚马逊使用HtmlAgilityPack,但似乎亚马逊网页有一些问题,我无法访问适当的字段。

下面是我所做的:

我使用Firefox和Firebug + FirePath来检索所需的XPath,然后在我的代码中,我调用HtmlAgilityPack并指示它使用从Firebug获得的XPath获取信息但运气不好,直到现在我还无法访问亚马逊网站的"产品详细信息"部分

这是我的XPath(它只与htmllagilitypack一起工作)

HtmlAgilityPack.HtmlNodeCollection cnt = doc.DocumentNode.SelectNodes("//*[@class='content']");
int i=1;
foreach (HtmlAgilityPack.HtmlNode content in cnt)
{
    if (i != 3)
    {
        i++;
        continue;
    }
    if (i == 3) // i==3 means I've reached the product details but I can't go any further :(
    {
        s = content.SelectSingleNode("").OuterHtml;
      //  break;
    }
}

我如何访问产品详细信息使用适当的可理解的XPath htmllagilitypack ?

为什么Firebug + FirePath XPath的语法与htmllagilitypack不同?

不能使用c#/ htmlilitpack从amazon.com获取适当的信息

正如@Mystere所说,我建议使用API。但是如果你这样做是为了测试目的,或者只是因为你想使用网络抓取来获取信息(我不确定亚马逊是否允许它。您应该在执行此操作之前检查),事情是这样的:

你为什么要这样做?

s = content.SelectSingleNode("").OuterHtml;

如果你想获得页面那部分的HTML来源,下面是你正在寻找的内容。

s = content.OuterHtml;

当你在抓取的时候,我建议你试着找出你需要抓取的部分,看看那块内容的特殊性。

如果你使用:

var node = doc.DocumentNode.SelectNodes("//td[@class='bucket']/div[@class='content']");

,它将为您提供您正在寻找的产品详细信息块。如果您想获得一些字段,如平装出版商,…你可以这样做:

string paperback = node.SelectSingleNode("./ul/li[1]/text()").InnerText;
string publisher = node.SelectSingleNode("./ul/li[2]/text()").InnerText;
string language = node.SelectSingleNode("./ul/li[3]/text()").InnerText;
...

如果您想要确保您正在使用的XPath对于htmllagilitypack是正确的,请在Internet Explorer 8(或9)上打开页面并使用开发人员工具(F12)来获取XPath。问题是每个浏览器都以特定的方式呈现HTML。例如,在Firefox中,您总是会在<table>之后看到<tbody>标记,因此可能HtmlAgilityPack没有,并且将/tbody/添加到XPath的简单细节可能会使您的程序失败。

为什么不直接使用亚马逊的web服务api呢?