1

任务

我应该创建一个从 Amazon.com 网页中提取项目名称的应用程序。

行动

我想我会使用 Html Agility Pack 来完成这项工作,我想我已经有了一个解决方案,但是有一个错误一直存在。

结果

假设我试图从 n 个不同的站点中提取 html 源代码,该应用程序始终使用站点 1 - n 的第一个站点的源代码,我不知道为什么。当且仅当我重新启动计算机时,我才能从不同的网站提取 html。

代码

    private void extractHTML()
    {
        //retreive URL
        string address = txtURL.Text;
        string itemId = "result_0";

        //create document
        HtmlWeb webGet = new HtmlAgilityPack.HtmlWeb();
        HtmlAgilityPack.HtmlDocument document = webGet.Load(address);

        //look for name of result
        HtmlNode node = document.GetElementbyId(itemId);            
        if(node != null)
        {
            IEnumerable<HtmlNode> allH3 = node.Descendants("h3");

            foreach (HtmlNode h3 in allH3)
            {
                if (h3.ChildNodes[1].InnerHtml == null)
                {
                    continue;
                }
                else
                {
                    lblId.Text = itemId;

                    //dig down to lowest subnode to get correct InnerHtml
                    HtmlNode subNode = h3.ChildNodes[1];
                    if (subNode.ChildNodes.Count > 0)
                    {
                        lblName.Text = subNode.ChildNodes[subNode.ChildNodes.Count - 1].InnerHtml;
                        break;
                    }
                    else
                    {
                        lblName.Text = h3.ChildNodes[1].InnerHtml;                            
                        break;
                    }
                }
            }
        }            
    }

非常感谢您的帮助!提前致谢。

4

2 回答 2

0

如果,如评论中所述,您将诸如http://www.amazon.com/s/ref=nb_sb_ss_i_0_5?url=search-alias%3Daps&field-keywords=radio&sprefix=radio%2Caps%2C182之类的页面定位到尝试获取所有项目名称,然后是以下代码:

HtmlDocument doc = new HtmlDocument();
doc.Load(myHtmlFile);

foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//span[@class='lrg bold']"))
{
    Console.WriteLine(node.InnerHtml);
}

将输出:

Sony ICF-S10MK2 Pocket AM/FM Radio, Silver
Ambient Weather WR-111A Emergency Solar Hand Crank AM/FM/NOAA Digital Radio, Flashlight, Cell Phone Charger with NOAA Certified Weather Alert &amp; Cables
Sony ICF38 Portable AM/FM Radio (Black)
Coby CX39 World Band AM/FM/Shortwave Radio with Digital Display, Silver
Radio
Sony ICF-C318 Clock Radio with Dual Alarm (Black)
Sony Icf38 Portable Am Fm Radio Led Tuning Indicator Lg Spkr
TuneIn Radio
Sangean WR-2 Digital AM/FM Tabletop Radio, Walnut
SANGEAN WR-11 AM/FM Table Top Radio
Crosley Solo Radio CR221 Black
Sony ICF-C218 Automatic Time Set Clock Radio (Black)
Coby CXCD251BLK Portable CD Player with AM/FM Radio, Black
Sony ICFC414 Clock Radio
Radio
Panasonic RF-P50 Pocket AM/FM Radio, Silver

XPATH 表达式将只获取所有将 CLASS 属性设置为“lrg bold”的 SPAN 元素。为了找到它,我只是查看了 HTML 的保存版本,并确定了项目名称的良好判别式。

我建议你学习一点 XPATH,因为它非常强大。一个很好的教程在这里:XPATH 教程

于 2013-01-14T16:52:09.157 回答
0

您是否考虑过使用亚马逊产品 API 而不是屏幕抓取?这里有很多示例http://aws.amazon.com/code/Product-Advertising-API

于 2013-01-13T17:33:39.643 回答