C#でHTMLを解析する(Html Agility Packライブラリ)

C#でHTMLを解析したい場合は「Html Agility Pack」というオープンソースのライブラリを使うと便利です。

パッケージマネージャーの NuGet からインストールが可能なので Visual Studio を使っている人なら導入も簡単です。

 

ここでは「Html Agility Pack」の導入から使い方までを解説します。


NuGetからHtml Agility Packをインストール

Visual Studio を使っている方なら NuGet を使って簡単にライブラリのインストールが可能です。

 

 

メニューから「ツール(T)」→「NuGet パッケージ マネージャー(N)」→「ソリューションのNuGet パッケージ管理(N)...」を選択します。

「参照」をクリックしてから検索欄に「HtmlAgilityPack」と入力しましょう。

リストの一番上に出てくるパッケージを選択すると右側にインストール画面が出てきます。

右画面の中で適用するプロジェクトにチェックを付けてから「インストール」ボタンをクリックします。

 

インストールが完了するとソリューションエクスプローラの参照に HtmlAgilityPack が追加されます。


HTMLを解析する

 

HTMLを解析するには HtmlAgilityPack.HtmlDocument クラスを使います。

static void Main()
{
    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
    WebClient wc = new WebClient();
    System.IO.Stream st = wc.OpenRead("https://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8");
    System.IO.StreamReader sr = new StreamReader(st, System.Text.Encoding.UTF8);

    HtmlDocument html = new HtmlDocument();
    html.Load(sr);

    var root = html.DocumentNode;
    var h2Nodes = root.SelectNodes("//h2");                    //ドキュメント内すべての<h2>要素を取得
    var ulNodes = root.SelectNodes("//ul[@id='footer-info']"); //ドキュメント内すべての<ul>要素の中からid属性が'footer-info'の要素を取得
    var liNodes = ulNodes[0].SelectNodes("li");                //この要素の直下にある<li>要素を取得
    var aNodes  = ulNodes[0].SelectNodes(".//a");              //この要素内のすべて<a>要素を取得
}

HtmlDocumentクラスのインスタンスを作成し、LoadメソッドでHTMLデータを解析します。

 

SelectNodesメソッドを使うと特定の要素を検索して抜き出す事が可能です。

抜き出す要素の指定は XPath という構文を使います。