ドキュメントオブジェクトを取得する
1. ドキュメントオブジェクトの作成
HtmlDocument document = new HtmlDocument();Code language: JavaScript (javascript)
2. 二つの読み込み方法
1)HTML文字列の読み込み
document.LoadHtml(htmlString);Code language: JavaScript (javascript)
2)ローカルHTMLファイル読み込み(文字化け防止のためエンコーディングを指定)
document.Load(@"c:/news.html", Encoding.UTF8);Code language: JavaScript (javascript)
Windowsパスでは
@によるエスケープ無効化を推奨。教材内のc://news.htmlは記述例に過ぎません。
3. ルートノードを取得
HtmlNode rootNode = document.DocumentNode;Code language: JavaScript (javascript)
すべてのxpathクエリはrootNodeを基点に実行されます。
ノード操作
1. ノードHTMLから新規ノード生成
HtmlNode newNode = HtmlNode.CreateNode(newsNode.OuterHtml);
OuterHtml:自身のタグと内部のHTMLをすべて含む- ノードのコピーや一部HTMLを切り出して解析する場面でよく使います
2. ノード検索
SelectSingleNode("XPath"):条件に合う最初のノードを返し、戻り値はHtmlNode
HtmlNode childNode = itemNode.SelectSingleNode("//div[1]");Code language: JavaScript (javascript)
SelectNodes("XPath"):条件に合うノードをすべて取得、戻り値はHtmlNodeCollection
3. テキストと属性の読み取り
- ノード内のプレーンテキスト取得
string text = itemNode.InnerText;
- タグ属性の取得(基本的な書き方)
string href = itemNode.Attributes["href"].Value;Code language: JavaScript (javascript)
注意:タグに
href属性が存在しない場合、Attributes["href"]はnullとなり実行時エラーが発生します。
安全な記述方法を推奨:
string href = itemNode.GetAttributeValue("href", "");Code language: JavaScript (javascript)
4. ニュースリストを走査する完全サンプルコード
foreach (HtmlNode item in newsList)
{
string title = item.InnerText;
string href = item.Attributes["href"].Value;
}Code language: PHP (php)
補足情報
- null値への対応
SelectNodes()がノードを見つけられないとnullを返します。foreach実行前に必ず判定を入れてください:
if(newsList != null)
{
foreach(var item in newsList){ ... }
}Code language: PHP (php)
- InnerText / InnerHtml / OuterHtml の違い
InnerText:タグを除去し、テキストだけ抽出InnerHtml:ノード内部のHTML、自身のタグは含まないOuterHtml:自身のタグ+内部のすべてのHTML
- XPath小ヒント
//divは全体からdiv要素を検索。//を省略すると直接の子ノードのみを対象とします。
完全なコード例
using HtmlAgilityPack;
using System.Text;
//1.ドキュメント初期化
HtmlDocument document = new HtmlDocument();
document.Load("news.htm", Encoding.UTF8);
HtmlNode rootNode = document.DocumentNode;
//2.ニュースリンクを一括取得
HtmlNodeCollection newsList = rootNode.SelectNodes(@"//div[@class='blk122']/a");
if(newsList != null)
{
foreach (HtmlNode item in newsList)
{
string title = item.InnerText.Trim();
string link = item.GetAttributeValue("href", "");
Console.WriteLine($"タイトル:{title} リンク:{link}");
}
}Code language: JavaScript (javascript)
ドキュメントコンテンツを取得する
Previous: 活用例