Html Agility Pack来自多个页面的相同html源代码

时间:2013-01-13 00:26:52

标签: c# html html-agility-pack

任务

我应该创建一个从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;
                    }
                }
            }
        }            
    }

非常感谢帮助!提前谢谢。

2 个答案:

答案 0 :(得分:0)

您是否考虑过使用Amazon Product API而不是屏幕抓取?这里有大量样本http://aws.amazon.com/code/Product-Advertising-API

答案 1 :(得分: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 Tutorial