我想获取诸如作者姓名/页面/发布年份等的书籍信息...... 从亚马逊使用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不同?
答案 0 :(得分:3)
正如@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对HtmlAgilityPack是正确的,请打开Internet Explorer 8(或9)上的页面并使用开发人员工具(F12)获取XPath。问题是每个浏览器以特定方式呈现HTML。例如,在<tbody>
之后,您将始终在Firefox中看到<table>
标记,因此可能HtmlAgilityPack没有,并且将/tbody/
添加到XPath的简单细节可能会导致程序失败
答案 1 :(得分:0)
为什么不使用专为此目的而设计的亚马逊网络服务API?