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

时间:2011-04-25 20:12:16

标签: 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不同?

2 个答案:

答案 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?