C#でHTML解析: HTML Agility Pack入門
HTML Agility Packの使い方 (C#プログラミング)
HTML Agility Pack は、C#でHTML文書を解析するためのライブラリです。DOM (Document Object Model) のようなインターフェースを提供し、HTML要素の取得、変更、操作を容易に行うことができます。
NuGetパッケージのインストール
まず、プロジェクトにHTML Agility Packをインストールします。NuGetパッケージマネージャーを開き、検索ボックスに「HtmlAgilityPack」と入力し、インストールボタンをクリックします。
HTML文書の読み込み
using HtmlAgilityPack;
// HTML文書の読み込み
HtmlDocument doc = new HtmlDocument();
doc.Load("your_html_file.html");
HTML要素の取得
// 最初の<p>要素を取得
HtmlNode firstParagraph = doc.DocumentNode.SelectSingleNode("//p");
// すべての<a>要素を取得
HtmlNodeCollection links = doc.DocumentNode.SelectNodes("//a");
HTML要素の属性の取得と変更
// <a>要素のhref属性を取得
string href = links[0].Attributes["href"].Value;
// <p>要素のテキストを変更
firstParagraph.InnerText = "新しいテキスト";
新しい要素の追加
// 新しい<p>要素を追加
HtmlNode newParagraph = doc.CreateElement("p");
newParagraph.InnerText = "追加されたテキスト";
doc.DocumentNode.AppendChild(newParagraph);
HTML文書の保存
// 変更されたHTML文書を保存
doc.Save("modified_html.html");
例
using HtmlAgilityPack;
// HTML文書の読み込み
HtmlDocument doc = new HtmlDocument();
doc.Load("index.html");
// すべての<a>要素のhref属性を取得し、コンソールに出力
HtmlNodeCollection links = doc.DocumentNode.SelectNodes("//a");
foreach (HtmlNode link in links)
{
string href = link.Attributes["href"].Value;
Console.WriteLine(href);
}
HTML Agility Packを使ったC#でのHTML解析: 例
基本的なHTML文書の解析
using HtmlAgilityPack;
// HTML文書の読み込み
HtmlDocument doc = new HtmlDocument();
doc.Load("index.html");
// 最初の<p>要素のテキストを取得
string firstParagraphText = doc.DocumentNode.SelectSingleNode("//p").InnerText;
Console.WriteLine(firstParagraphText);
このコードでは、index.html
というファイルを読み込み、最初の<p>
要素のテキストをコンソールに出力します。
すべてのリンクの取得
using HtmlAgilityPack;
// HTML文書の読み込み
HtmlDocument doc = new HtmlDocument();
doc.Load("index.html");
// すべての<a>要素を取得
HtmlNodeCollection links = doc.DocumentNode.SelectNodes("//a");
// すべてのリンクのhref属性を取得し、コンソールに出力
foreach (HtmlNode link in links)
{
string href = link.Attributes["href"].Value;
Console.WriteLine(href);
}
このコードでは、すべての<a>
要素(リンク)を取得し、それぞれのhref
属性(リンクのURL)をコンソールに出力します。
using HtmlAgilityPack;
// HTML文書の読み込み
HtmlDocument doc = new HtmlDocument();
doc.Load("index.html");
// 新しい<p>要素を作成
HtmlNode newParagraph = doc.CreateElement("p");
newParagraph.InnerText = "追加されたテキスト";
// 最初の<p>要素の後に新しい要素を追加
doc.DocumentNode.SelectSingleNode("//p").AppendChild(newParagraph);
// 変更されたHTML文書を保存
doc.Save("modified_index.html");
このコードでは、新しい<p>
要素を作成し、既存の最初の<p>
要素の後に追加します。最後に、変更されたHTML文書をmodified_index.html
というファイルに保存します。
属性の変更
using HtmlAgilityPack;
// HTML文書の読み込み
HtmlDocument doc = new HtmlDocument();
doc.Load("index.html");
// 最初の<a>要素のhref属性を変更
HtmlNode firstLink = doc.DocumentNode.SelectSingleNode("//a");
firstLink.Attributes["href"].Value = "https://example.com";
このコードでは、最初の<a>
要素のhref
属性を新しいURLに変更します。
AngleSharp
- 使用方法
using AngleSharp; // ブラウザコンテキストの作成 var context = BrowsingContext.New(); // HTML文書の読み込み var document = await context.OpenAsync(req => req.Content("<!DOCTYPE html><html><head><title>Example</title></head><body><p>Hello, world!</p></body></html>")); // 要素の選択と取得 var paragraph = document.QuerySelector("p"); Console.WriteLine(paragraph.TextContent);
- 特徴
- CSSセレクターを使用できるため、HTML要素の選択が直感的。
- HTML5の最新の機能に対応。
- 非同期処理が可能で、パフォーマンスが向上。
CsQuery
- 使用方法
using CsQuery; // HTML文書の読み込み var dom = CQ.Create("<html><head><title>Example</title></head><body><p>Hello, world!</p></body></html>"); // 要素の選択と取得 var paragraph = dom["p"]; Console.WriteLine(paragraph.Text());
- 特徴
- jQueryライクなAPIを提供し、DOM操作がシンプル。
- CSSセレクターを使用可能。
- XPathもサポート。
NodaTime.Html
- 使用方法
using NodaTime.Html; // HTML文書の読み込み var html = "<p>The time is <time datetime='2023-12-31T23:59:59Z'>23:59:59</time></p>"; // 日時情報の取得 var time = HtmlLocalDateTime.Parse(html); Console.WriteLine(time);
- 特徴
- NodaTimeライブラリと組み合わせて、HTML内の日付や時刻を解析できる。
Regex (正規表現)
- 使用方法
using System.Text.RegularExpressions; // HTML文書の読み込み var html = "<p>Hello, world!</p>"; // 正規表現による抽出 var match = Regex.Match(html, "<p>(.*?)</p>"); if (match.Success) { Console.WriteLine(match.Groups[1].Value); }
- 特徴
- シンプルなパターンマッチングに適している。
- 複雑なHTML構造には適さない場合がある。
c# html html-agility-pack