C#にてAngleSharpを使う機会があったため、AngleSharp(ver:0.9.10)の一部の使用方法をメモ。
まだ少し改善余地のあるライブラリですが、HTML解析などには十分使用することができると思います。
HTMLをパースする
HTMLをパースするには、HtmlParserクラスのParseメソッドを使用します。例)文字列(HTML)をパースする方法
//サンプルとして使用するHTML
var htmlText = @"
<html>
<head>
<meta charset = 'UTF-8'/>
<title>AngleSharpの使い方</title>
</head>
<body>
<div id = 'header' name='headerName'>
<h1 id = 'headerTitle'>AngleSharpの使い方</h1>
</div>
<ul id='linkList'>
<li class = 'link'><a href='@'>トレーニング用リンク1</a></li>
<li class = 'link'><a href='@'>トレーニング用リンク2</a></li>
</ul>
</body>
</html>
";
// HtmlParserクラスをインスタンス化
var parser = new HtmlParser();
// HtmlParserクラスのParserメソッドを使用してパースする。
// Parserメソッドの戻り値の型はIHtmlDocument
var htmlDocument = parser.Parse(htmlText);
要素の取得
要素の指定方法には、従来通りのDOM操作に加えて、
セレクタを用いた取得方法もあるため要素の取得が簡単。
例)条件に一致する要素をすべて取得する方法
// aタグの要素を全て取得する。
var urlElements = htmlDocument.QuerySelectorAll("a");
代表的な要素取得用のプロパティとメソッドは以下の通り。
プロパティ名/メソッド名 | 取得対象 |
---|---|
Head | <head>~</head>内の全ての要素 |
Body | <body>~</body>内の全ての要素 |
Children | 対象の全ての子要素 |
GetElementById() | id属性が一致する要素 |
GetElementsByClassName() | class属性が一致する全ての要素 |
GetElementsByName() | name属性が一致する全ての要素 |
GetElementsByTagName() | タグ名が一致する全ての要素 |
QuerySelector() | セレクタの一致する要素 |
QuerySelectorAll() | セレクタの一致する全ての要素 |
要素の追加
例)指定タグの子要素としてタグを追加する方法
ページ上部のHTMLに新しくリンクを追加する場合。// liタグ要素を作成する。
var listItem= htmlDocument.CreateElements("li");
// aタグ要素を作成する。
var link = htmlDocument.CreateElement("a");
link.SetAttribute("href","https://www.google.co.jp/");
link.TextContent = "Googleへのリンク";
// liタグにaタグの要素を追加する。
listItem.AppendChild(link);
// 上で作成したliタグの要素をulタグの子要素として追加する。
htmlDocument.GetElementById("ul").AppendChild(listItem);
HTMLの整形
パースした内容をフォーマットして出力してくれる機能もある。 ※ver 0.9.10ではhtml、head要素など一部要素のフォーマットが崩れることを確認。例)HTMLを整形する
``` // フォーマット後のHTML格納用変数 var sw = new StringWriter();// フォーマッタ変数
var formatter = new PrettyMarkupFormatter();
// ToHtml関数の第一引数にStringWriter、
// 第二引数にPrettyMarkupFormatterを指定する。
htmlDocument.ToHtml(sw,formatter);