ドキュメントコンテンツを取得する

ドキュメントオブジェクトを取得する

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. テキストと属性の読み取り

  1. ノード内のプレーンテキスト取得
string text = itemNode.InnerText;
  1. タグ属性の取得(基本的な書き方)
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)

補足情報

  1. null値への対応
    SelectNodes()がノードを見つけられないとnullを返します。foreach実行前に必ず判定を入れてください:
if(newsList != null)
{
    foreach(var item in newsList){ ... }
}Code language: PHP (php)
  1. InnerText / InnerHtml / OuterHtml の違い
  • InnerText:タグを除去し、テキストだけ抽出
  • InnerHtml:ノード内部のHTML、自身のタグは含まない
  • OuterHtml:自身のタグ+内部のすべてのHTML
  1. 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:

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です