.net column
.NET開発者のためのブログメディア

Webサイトの要素

C#でのスクレイピングの方法とは?2つのパッケージと手法を紹介

2020年08月25日
SE
html解析をC#で行う方法について教えてください。
PM
わかりました。それでは、html形式ファイルをC#で解析する方法についてご紹介いたしましょう。

そもそもスクレイピングとは何?


現在インターネットには様々なWebサイトが存在します。スクレイピングとはこれらのWebサイトからhtmlをダウンロード後に解析を実行し必要なデータを取得することです。

C#でWebスクレイピング用パッケージを追加してサンプルコードを提示します。

C#によるhtml解析とは?

htmlとはHyper Text Markup Languageの略で、インターネットのWebページを記述するためのファイル形式です。<html>や<br/>のようなタグが記述されているテキストを見たことがある人は多いでしょう。それがhtmlファイルです。

C#ではこのhtml形式ファイルの解析を、とても簡単に行うことができるのです。標準機能ではありませんがそれに近く、出所不明のライブラリを使う必要もありません。ここでそのやり方を説明するので、是非ご覧ください。

C#でスクレイピングを行えるパッケージ

C#でスクレイピングを実行するために使用可能なパッケーとしてはSeleniumのようにブラウザを使用するタイプもありますが、ここではブラウザを使用しないタイプのHtml Agility packとAngleSharpの2つのパッケージについての説明や簡単なサンプルコードを提示します。

Html Agility Pack

C#で利用可能なスクレイピング用のパッケージの一つです。ブラウザを使用せずにWebページを取り込んでDOM構造に展開して、SelectNode等によりXPathで指定した条件で検索して情報を取得します。

AngleSharp

C#で利用可能なスクレイピング用のパッケージの一つです。ブラウザを使用せずにWebページを取り込んでQuerySelectorAllやGetElementsByTagName等でhtmlのタグ名やid名を指定して情報を取得します。

Html Agility Packによるhtml解析について

.Net FrameworkにはフリーでオープンソースのNuGetというプロジェクトがあります。このNuGetのパッケージは、Visual Studio上から自動的にダウンロードしてインストールが可能です。自力でどこかのサイトから持ってくるのではないため、安心して利用できます。

C#のhtml解析にはこのNuGetパッケージのHtml Agility Packを使用します。インストールする方法は、まずVisual Studio上部のメニューの「プロジェクト」から、「NuGetパッケージの管理」を選択してください。

Html Agility Packをインストール

NuGetパッケージの管理画面が表示されたら、左上の「参照」を選択し、検索フォームに「Html Agility Pack」と入力してください。すると検索結果にHtml Agility Packが出てくるのでそれを選択して、インストールしましょう。

インストールが終わると、ソリューションエクスプローラーの依存関係のパッケージにHtmlAgilityPackが追加されています。これでhtmlを解析できるようになりました。

Html Agility Packによるhtml解析のサンプルコード

以下はC#によるhtml解析のとても簡単なサンプルです。実行する場合はソースの先頭に「using System.Net;」と「using HtmlAgilityPack;」を記述してください。

Html Agility Packによるスクレイピング手法3つ

ここではHtml Agility Packを使用して、htmlを解析した結果よりテキストを表示する、metaタグを解析してテキストを表示する、全spanタグを解析してテキストを表示するというC#による3つのスクレイピングのサンプルコードを提示します。

1:テキストを取得

LoadHtmlで解析が終わった後は、タグやテキストを取得できます。

DocumentNode.SelectSingleNodeで”/html/head/title”と指定していますが、これで<html><head><title>の中身をHtmlNodeCollectionとして取得できます。

あとは取得したHtmlNodeの中身をInnerTextメソッドで表示します。2:タグの属性を取得

htmlのタグには属性があります。例えばmetaタグは<meta name=”description” content=”~”>のようになっていますが、idとcontentが属性に相当します。これを解析して取得するC#サンプルが以下です。

:HtmlAttributeに属性が格納される

上のC#サンプルを実行すると、首相官邸ホームページのheadタグ内のmetaタグのidとcontentが全て表示されます。HtmlNodeクラスのプロパティのAttributesでHtmlAttributeのコレクションを取得し、NameとValueで属性の値を取得できるということです。

ただしここまでサンプルは、あまり実用的ではありません。実際にhtmlを解析する場合は、html全体の中からある名前のタグのテキストを取得したい、みたいな使い方をしたいはずです。実はそのようなことも簡単にできます。

3:指定したタグ名のテキストを全て取得する

以下のC#のサンプルは、htmlにある全てのspanタグ内のテキストを表示します。

html解析に便利なXPath

今までSelectSingleNodeやSelectNodesに指定した文字列は、XPathと呼ばれる表記法に基づいています。”//”と記述すると途中までのパスが省略されます。そして”//span”とした場合はhtml内の全てのspanタグが該当するのです。

上記C#サンプルのSelectNodesの文字列を、”//span[@class=’date’]”として実行すると、<span class=’date’>の箇所のみのテキストを取得できます。また”//span[contains(text(), ‘総理’)]”とすれば、テキストに「総理」が含まれたテキストのみを取得できます。

XPathは他にも豊富な機能を持っているので、マスターすればhtmlをどのようにも解析できるようになるでしょう。

AngleSharpでのスクレイピングの手法3つ

ここではAngleSharpを使用して、クレイピングの手法3つをソースコードを交えながら紹介します。手法を紹介する前にAngleSharpをインストール方法を簡単に解説します。

NuGetパッケージの管理画面が表示されたら、左上の「参照」を選択し、検索フォームに「AngleSharp」と入力してください。すると検索結果にAngleSharpが出てくるのでそれを選択して、インストールしましょう。

インストールが終わると、ソリューションエクスプローラーの依存関係のパッケージにAngleSharpが追加されています。これでhtmlを解析できるようになります。

1:htmlを取得する

以下のC#のサンプルは、首相官邸ホームページのhtmlファイルをテキストとして表示します。実行する場合はソースの先頭に「using AngleSharp;」を記述してください。

2:タイトルを取得する

以下のC#のサンプルは、htmlにあるtitleタグ内のテキストを表示します。

3:テキストを取得する

以下のC#のサンプルは、htmlにある全てのspanタグ内のテキストを表示します。

AngleSharpを使用したスクレイピングのメリット

context.OpenAsync(Webサイトのurl)で取得した結果より、QuerySelectorAllやGetElementsByTagName等を使用して簡単にC#でスクレイピングが実行できます。

XPath、JavaScript、DOM、CSSを有効にする場合はNuGetを使用して必要なパッケージを追加することで対応可能となります。

SE
これなら私にもできそうです。
PM
C#だとhtmlを誰でも簡単に解析できるようになりますので、ぜひC#でhtml解析ツールを作ってみてください。

C#でのスクレイピングの方法について知識を深めよう

C#のhtml解析の方法について解説しましたが、ご理解頂けたでしょうか。

簡単に解析できて、かつ強力な機能を持っていることがわかって頂けたと思います。是非マスターして誰もが驚くようなC#のhtml解析ツールを作成してみてください。


.NET分野でのキャリアアップをお考えの方は、現在募集中の求人情報をご覧ください。

また、直接のエントリーも受け付けております。

エントリー(応募フォーム)

Search

Popular

reccomended

Categories

Tags