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

标签 c# xpath html-agility-pack

我想获取书籍信息,例如作者姓名/页数/出版年份/等... 使用 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 可能会使您的程序失败。

关于c# - 使用 c#/htmlagilitpack 无法从 amazon.com 获取正确的信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5782741/

相关文章:

c# - 有没有办法以管理员权限运行 UWP 应用程序?

php - 使用 xpath 时避免类中的某些元素

c#-4.0 - XmlDocument选择节点: find an element by an attribute value only

python - 在Python中的Xpath中选择标签之间的文本

c# - 如何使用 HTMLAgility 包在另一个网页上发布数据?

c# - HtmlAgilityPack Attributes.Remove on Image 只删除一个,当有两个时

c# - HtmlAgilityPack - 删除节点后保留文本位置

c# - 基础连接已关闭。 (HttpWebRequest)

c# - Premailer.Net 错误 : Could not load type 'AngleSharp.Parser.Html.HtmlParser' from assembly AngleSharp 0. 10.1

c# - 如何防止从 asp.net linkbutton 回发