.net column

.NET開発者のためのブログメディア
Webサイトの要素

C#なら簡単にhtmlページを解析できる!

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

C#によるhtml解析とは?

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

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

なおこのページのサンプルは全て、Visual Stuidoをインストールしてインターネットに接続したWindowsPCで動作させる前提です。どうかご了承ください。

NuGetパッケージの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を解析できるようになりました。

C#によるhtml解析のサンプル

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

WebClient wc = new WebClient();
string htmlStr = wc.DownloadString(“”http://www.kantei.go.jp/””);
if (htmlStr != null)
{
var htmlDoc = new HtmlDocument();
htmlDoc.LoadHtml(htmlStr);
HtmlNode n = htmlDoc.DocumentNode.SelectSingleNode(“”/html/head/title””);
Console.WriteLine(n.InnerText);
}

HtmlAgilityPackでスクレイピングできる

上のC#サンプルを実行するとwww.kantei.go.jpにアクセスして、おそらく「首相官邸ホームページ」と表示されるはずです。これはアクセスしたこのページのhtmlの内容次第です。それではサンプルの内容を説明しましょう。

まずWebClientクラスのDownloadStringにより、Webサイトのhtmlを文字列として取得します。結果がnullではない場合は取得できたと判断し、HtmlAgilityPackのHtmlDocumentクラスのLoadHtmlで解析します。これをスクレイピングと言います。

タグ名を指定して中身のテキストを取得可能

LoadHtmlで解析が終わった後は、タグやテキストを取得できます。DocumentNode.SelectSingleNodeで””/html/head/title””と指定していますが、これで<html><head><title>の中身をHtmlNodeCollectionとして取得できます。

あとは取得したHtmlNodeの中身をInnerTextメソッドで表示します。<title>の中身は「首相官邸ホームページ」というテキストだけなので、それのみが表示されるということです。

タグの属性も取得できる

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

WebClient wc = new WebClient();
string htmlStr = wc.DownloadString(“”http://www.kantei.go.jp/””);
if (htmlStr != null)
{
var htmlDoc = new HtmlDocument();
htmlDoc.LoadHtml(htmlStr);
HtmlNodeCollection nodes = htmlDoc.DocumentNode.SelectNodes(“”/html/head/meta””);
foreach (HtmlNode node in nodes)
{
foreach (HtmlAttribute attr in node.Attributes)
{
Console.WriteLine(attr.Name + “” “” + attr.Value);
}
}
}

HtmlAttributeに属性が格納される

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

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

指定したタグ名のテキストを全て取得するサンプル

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

WebClient wc = new WebClient();
string htmlStr = wc.DownloadString(“”http://www.kantei.go.jp/””);
if (htmlStr != null)
{
var htmlDoc = new HtmlDocument();
htmlDoc.LoadHtml(htmlStr);
HtmlNodeCollection nodes = htmlDoc.DocumentNode.SelectNodes(“”//span””);
foreach (HtmlNode node in nodes)
{
Console.WriteLine(node.InnerText);
}
}

html解析に便利なXPath

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

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

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

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

C#のhtml解析の機能は手軽でかつ強力

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

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


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

求人一覧

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

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