どうやってhtmlの敏捷性を使って<b>、 <br></b>

c# html-agility-pack html-parsing screen-scraping

質問

私は先週この同じプロジェクトについて尋ねたことがありませんでしたし、何の提案もありませんでした。私はより明確にしようとします。私はウェブサイトwww.gtin13.comのデータを使って作業しようとしています。例えば、あなたが検索にピーナッツバターを入力した場合、私は説明をつかむことを試みている:**ナビスコナターバターサンドイッチのクッキーチョコレートピーナッツバター4 Ct * サイズ :サイズ:12オンスGTIN: 0044000003562 * ean :** 00- 44000-00356-2 upc: 044000003562、 upca: 04400000356。selectNodes ("<b>") nodeCollectionを使用しようとしましたが、エラーはすべて発生します。 htmlの敏捷性を使用して<b> <br>間のデータを取得し、/ sの間で解析することも可能ですか?私の経験が不足しているので、私はこれを進めることはできません。返されたページに真のノードと思われるものは表示されません。 htmlの敏捷性がこれを行うことができない場合、誰もより良いアプローチを提案できますか?最終的には、各データをSQLテーブルに送信したいと思います。私はより良い意味で提示してほしい。

このページは、このソース形式の情報を返します。

<b><a href="/product/nabisco+nutter+butter+sandwich+cookies+chocolate+peanut+butter+4+ct/">Nabisco Nutter Butter Sandwich Cookies Chocolate Peanut Butter 4 Ct</a></b><br />

Size: 12 oz<br />

GTIN/EAN-13: 0044000003562 / 00-44000-00356-2<br />

UPC-A: 044000003562 / 04400000356<br />



Tags:

<a href="/tag/chocolate/">Chocolate</a>, 

<a href="/tag/cookies/">Cookies</a>, 
 ..<br />

<br >

受け入れられた回答

元のドキュメントは非常に非構造化されています(階層レイアウトではなくフラットなものです)が、Html Agility Packを使用してメインテキストフィールドを抽出する方法は簡単です。

        HtmlDocument doc = new HtmlDocument();
        doc.Load("yourDoc.Htm");

        // Get A nodes that have an HREF attribute
        foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//b/a[@href]"))
        {
            // This will contain anchor's displayed text
            string title = node.InnerText;
            Console.WriteLine("title=" + title);

            // Get the 1st BR, and then it's next sibling of TEXT type.
            HtmlNode sizeNode = node.SelectSingleNode("../following-sibling::br[1]/following-sibling::text()");
            Console.WriteLine(" size=" + sizeNode.InnerText.Trim());

            // Get the 3nd BR, and then it's next sibling of TEXT type.
            HtmlNode eanNode = node.SelectSingleNode("../following-sibling::br[2]/following-sibling::text()");
            Console.WriteLine(" ean=" + eanNode.InnerText.Trim());

            // Get the 3rd BR, and then it's next sibling of TEXT type.
            HtmlNode upcNode = node.SelectSingleNode("../following-sibling::br[3]/following-sibling::text()");
            Console.WriteLine(" upc=" + upcNode.InnerText.Trim());
        }

次のように表示されます:

        HtmlDocument doc = new HtmlDocument();
        doc.Load("yourDoc.Htm");

        // Get A nodes that have an HREF attribute
        foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//b/a[@href]"))
        {
            // This will contain anchor's displayed text
            string title = node.InnerText;
            Console.WriteLine("title=" + title);

            // Get the 1st BR, and then it's next sibling of TEXT type.
            HtmlNode sizeNode = node.SelectSingleNode("../following-sibling::br[1]/following-sibling::text()");
            Console.WriteLine(" size=" + sizeNode.InnerText.Trim());

            // Get the 3nd BR, and then it's next sibling of TEXT type.
            HtmlNode eanNode = node.SelectSingleNode("../following-sibling::br[2]/following-sibling::text()");
            Console.WriteLine(" ean=" + eanNode.InnerText.Trim());

            // Get the 3rd BR, and then it's next sibling of TEXT type.
            HtmlNode upcNode = node.SelectSingleNode("../following-sibling::br[3]/following-sibling::text()");
            Console.WriteLine(" upc=" + upcNode.InnerText.Trim());
        }

等...

注:標準の文字列操作(IndexOf、Substring、etc ...)やRegexを使ってサイズ、ean、upc変数を解析しなければならないので、100%完成しているわけではありません。


人気のある回答

HTQLを使用すると、ページからテーブル全体を抽出するクエリは次のようになります。

<div (CLASS='BGC')>1.<div (CLASS='CON')>1.<div (CLASS='SC')>1.<div (ID='post-20')>1.<div (CLASS='PostContent')>1.<b sep>2-0 {
  title=<a>1:tx; 
  size=/'Size:'~'<br />'/;
  gtin=/'GTIN/EAN-13:'~'<br />'/;
  upc=/'UPC-A:'~'<br />'/;
  tags=/'Tags:'~'<br />'/;
}

SQLデータベースに結果を送信するだけであれば、私はIRobotSoft Webスクレーパーを使用することをお勧めします。




ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ