我想获取书籍信息,例如作者姓名/页数/出版年份/等... 使用 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/