1

タスク

Amazon.comのウェブページから商品の名前を抽出するアプリケーションを作成することになっています。

アクション

これを行うにはHtmlAgilityPackを使用すると思いました。解決策はあると思いますが、1つのバグが解決し続けています。

結果

n個の異なるサイトからhtmlソースを取得しようとしたとしましょう。アプリケーションは、常にサイト1〜nの最初のサイトのソースを使用しますが、その理由はわかりません。コンピューターを再起動した場合にのみ、別のWebサイトから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

スクリーンスクレイピングの代わりにAmazonProductAPIを使用することを考えましたか?ここにはたくさんのサンプルがありますhttp://aws.amazon.com/code/Product-Advertising-API

于 2013-01-13T17:33:39.643 に答える
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属性が「lrgbold」に設定されているすべてのSPAN要素を取得するだけです。それを見つけるために、保存されたバージョンのHTMLを調べて、アイテム名の適切な判別式を決定しました。

XPATHは非常に強力なので、少し学ぶことをお勧めします。良いチュートリアルはここにあります:XPATHチュートリアル

于 2013-01-14T16:52:09.157 に答える