Skip to main content
 首页 » 编程设计

c#之使用 c#/htmlagilitpack 无法从 amazon.com 获取正确的信息

2024年04月12日10wayfarer

我想获取书籍信息,例如作者姓名/页数/出版年份/等... 使用 HtmlAgilityPack 从亚马逊获取,但似乎亚马逊网页存在一些问题,我无法访问相应的字段。

这是我所做的:

我使用 Firefox 和 Firebug + FirePath 检索所需的 XPath,然后在我的代码中调用 HtmlAgilityPack 并指示它使用我从 Firebug 获取的 XPath 获取信息 但运气不佳,到目前为止我无法访问 amazon.com 的“产品详细信息”部分

这是我的 XPath(仅适用于 HtmlAgilityPack)

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; 
    } 
 
} 

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

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

请您参考如下方法:

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

你为什么要这样做?

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

如果您想要获取页面该部分的 HTML 源代码,以下内容就是您要查找的内容。

s = content.OuterHtml; 

当您抓取时,我建议您尝试识别需要抓取的部分,并查看该内容 block 的特殊性。

如果您使用:

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

这将为您提供您正在寻找的产品详细信息 block 。 如果您想获取一些字段,例如平装本出版商,...您可以这样做:

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 对于 HtmlAgilityPack 来说是正确的,请在 Internet Explorer 8(或 9)上打开页面并使用开发人员工具 (F12) 获取 XPath。问题是每个浏览器都以特定的方式呈现 HTML。例如,您将始终看到 <tbody> Firefox 中的标签位于 <table> 之后,所以也许 HtmlAgilityPack 不会,并且添加 /tbody/ 的简单细节更改您的 XPath 可能会使您的程序失败。