C#を使用したWebスクレイピング

Webスクレイピングは、Webサイトからデータを抽出するために使用される手法です。 WebサイトやHTMLファイルからデータを抽出するプロセスを自動化するのに役立ちます。 C#開発者は、画像、ビデオ、オーディオなどのデータをWebページから簡単に検査、キャプチャ、および抽出できます。この記事では、C#を使用してHTML解析でWebスクレイピングを実行する方法を学習します。

この記事では、次のトピックについて説明します。

C#WebスクレイピングAPI

HTMLファイルまたはURLからのWebスクレイピングには、Aspose.HTML for .NETAPIを使用します。これは、外部ソフトウェアなしでHTMLドキュメントの生成、変更、抽出、変換、およびレンダリングを可能にする高度なHTML処理APIです。 APIのDLLをダウンロードするか、NuGetを使用してインストールしてください。

PM> Install-Package Aspose.Html

C#を使用してHTMLを読み取って抽出する

以下の手順に従って、任意のHTMLドキュメントからHTMLを読み取って抽出できます。

  1. HTMLDocumentクラスを使用してHTMLドキュメントをロードします。
  2. ファイルの内部HTMLをコンソールに表示します。

次のコードサンプルは、C#を使用してHTMLコンテンツを読み取って抽出する方法を示しています。

// このコード例は、HTMLドキュメントのコンテンツを表示する方法を示しています
// HTMLドキュメントをロードする
var document = new HTMLDocument(@"D:\Files\html\input.html");

// ドキュメントの内部HTMLを表示する
Console.WriteLine(document.Body.InnerHTML);
C#を使用してHTMLを読み取って抽出します。

C#を使用してHTMLを読み取って抽出します。

同様に、以下に示すように、ライブWebサイトからHTMLを読み取って抽出できます。

// このコード例は、ライブWebサイトのURLからコンテンツを表示する方法を示しています。
// URLを初期化する
Url url = new Url("https://en.wikipedia.org/wiki/HTML");

// URLインスタンスを使用してHTMLファイルをロードする
HTMLDocument document = new HTMLDocument(url);

// ファイルの内部HTMLをコンソールに表示
Console.WriteLine(document.Body.InnerHTML);

C#を使用してドキュメント要素を検査する

以下の手順に従って、ドキュメントとその要素を検査できます。

  1. HTMLDocumentクラスを使用してHTMLドキュメントをロードします。
  2. ドキュメントのHTML要素を取得します。
  3. HTML要素の最初/最後の要素を取得します。
  4. TagName、TextContentなどの要素の詳細を表示します。

次のコードサンプルは、C#を使用してドキュメント要素を検査する方法を示しています。

// このコード例は、HTML要素を検査する方法を示しています。
// ファイルからドキュメントをロードする
string documentPath = @"D:\Files\html\input.html";
HTMLDocument document = new HTMLDocument(documentPath);

// ドキュメントのhtml要素を取得します
var element = document.DocumentElement;
Console.WriteLine(element.TagName); // HTML

// html要素の最後の要素を取得します
element = element.LastElementChild;
Console.WriteLine(element.TagName); // BODY

// body要素の最初の要素を取得します
element = element.FirstElementChild;
Console.WriteLine(element.TagName); // H1
Console.WriteLine(element.TextContent); // Header 1

C#でフィルターを使用して特定の要素を検索する

カスタムフィルターを使用して、すべての画像やリンクなどを取得するなどの特定の要素を見つけることができます。この目的のために、APIはTreeWalkerインターフェースを提供します。これにより、whatToShowフラグとフィルター(存在する場合)によって定義されたドキュメントのビューを使用して、ドキュメントツリーまたはサブツリーをナビゲートできます。以下の手順に従って、フィルターを使用して特定の要素を見つけることができます。

  1. NodeFilterクラスを使用してフィルターを定義し、AcceptNode()メソッドをオーバーライドします。
  2. HTMLDocumentクラスを使用してHTMLドキュメントをロードします。
  3. CreateTreeWalker()メソッドを呼び出します。ルートノード、表示する内容、およびNodeFilterを引数として取ります。

次のコードサンプルは、C#を使用して特定の要素を見つける方法を示しています。

// このコード例は、フィルターを使用してデータをクエリする方法を示しています。
// HTMLドキュメントをロードする
HTMLDocument document = new HTMLDocument(@"D:\Files\html\input.html");

// HTMLナビゲーションを開始するには、TreeWalkerのインスタンスを作成する必要があります。
// 指定されたパラメータは、ドキュメントのルートから歩き始めることを意味します。
// すべてのノードを繰り返し、フィルターのカスタム実装を使用します
using (var iterator = document.CreateTreeWalker(document, Dom.Traversal.Filters.NodeFilter.SHOW_ALL, new OnlyImageFilter()))
{
    while (iterator.NextNode() != null)
    {
        // 独自のフィルターを使用しているため、現在のノードは常にHTMLImageElementのインスタンスになります。
        // したがって、ここで追加の検証は必要ありません。
        var image = (HTMLImageElement)iterator.CurrentNode;

        System.Console.WriteLine(image.Src);
        // 出力:image1.png
        // 出力:image2.png
    }
}
// このコード例は、ノードフィルターを定義する方法を示しています。
class OnlyImageFilter : Aspose.Html.Dom.Traversal.Filters.NodeFilter
{
    public override short AcceptNode(Aspose.Html.Dom.Node n)
    {
        // 現在のフィルターは、IMG要素を除くすべての要素をスキップします。
        return string.Equals("img", n.LocalName)
            ? FILTER_ACCEPT
            : FILTER_SKIP;
    }
}

C#を使用してHTMLからデータをクエリする

XPathクエリを使用して、以下の手順に従ってHTMLドキュメントからデータをクエリすることもできます。

  1. HTMLDocumentクラスを使用してHTMLドキュメントをロードします。
  2. Evaluate()メソッドを呼び出します。 XPath式の文字列、ドキュメント、および型を引数として取ります。
  3. 最後に、結果のノードをループしてテキストを表示します

次のコードサンプルは、C#を使用してXPathクエリでデータをクエリする方法を示しています。

// このコード例は、XPathクエリを使用してデータをクエリする方法を示しています。
// HTMLコードを準備する
var code = @"
    <div class='happy'>
        <div>
            <span>Hello!</span>
        </div>
    </div>
    <p class='happy'>
        <span>World</span>
    </p>
";

// 準備したコードに基づいてドキュメントを初期化します
HTMLDocument document = new HTMLDocument(code, ".");

// ここでは、すべての子SPAN要素を選択するXPath式を評価します 
// 'class'属性が'happy'に等しい要素から:
var result = document.Evaluate("//*[@class='happy']//span",
    document,
    null,
    Aspose.Html.Dom.XPath.XPathResultType.Any,
    null);

// 結果のノードを反復処理します
for (Aspose.Html.Dom.Node node; (node = result.IterateNext()) != null;)
{
    System.Console.WriteLine(node.TextContent);
    // 出力:こんにちは
    // 出力:世界!
}

C#でCSSセレクターを使用して抽出

CSSセレクターを使用してHTMLコンテンツを抽出することもできます。この目的のために、APIはQuerySelectorAll()メソッドを提供します。このメソッドを使用すると、HTMLドキュメントをナビゲートし、必要な要素を検索できます。クエリセレクターをパラメーターとして受け取り、すべての要素の一致するNodeListを返します。以下の手順に従って、CSSセレクターを使用してクエリを実行できます。

  1. HTMLDocumentクラスを使用してHTMLドキュメントをロードします。
  2. QuerySelectorAll()メソッドを呼び出します。クエリセレクターを引数として取ります。
  3. 最後に、結果の要素のリストをループします。

次のコードサンプルは、C#でCSSセレクターを使用してHTMLコンテンツを抽出する方法を示しています。

// 準備したコードに基づいてドキュメントを初期化します
HTMLDocument document = new HTMLDocument(@"D:\Files\html\input.html");

// ここでは、すべてのdiv要素を抽出するCSSセレクターを作成します
var elements = document.QuerySelectorAll("div");

// 結果の要素のリストを繰り返し処理します
foreach (Aspose.Html.HTMLElement element in elements)
{
    System.Console.WriteLine(element.InnerHTML);
}

無料ライセンスを取得する

無料の一時ライセンスをリクエストして、評価制限なしでAPIを試してください。

結論

この記事では、次の方法を学びました。

  • C#を使用してHTMLドキュメントのコンテンツを読み取り、抽出します。
  • ドキュメント要素を調べて、HTMLから特定の要素を見つけます。
  • CSS Selectorを使用して、特定のデータをクエリし、データを抽出します。

さらに、ドキュメントを使用して、Aspose.HTML for.NETAPIの詳細を学ぶことができます。ご不明な点がございましたら、フォーラムまでお気軽にお問い合わせください。

関連項目