.NET TIPS

HTMLファイルを簡単に解析するには?

デジタルアドバンテージ 岸本 真二郎
2008/06/26

 HTMLファイルの文法チェックや、特定のHTMLタグの内容を取り出したりする場合、独自のパーサーを作成したり、正規表現を使ってHTMLファイルを処理することがあるが、既存のHTMLパーサーを利用することで、作業を大幅に軽減できる。

 オープンソースのライブラリであるNTidyは、HTML Tidyの.NET版である。これは本来、HTMLファイルの文法チェックと整形を行う(文法エラーを自動修正する)ためのライブラリなのだが、そのAPIを利用することで、文法チェック以外にもHTMLファイルの解析に利用できる。

 また、本来の目的が文法に沿った自動的なHTMLタグの修正ということもあり、多少のHTMLタグの記述の誤りがあっても、文法エラーとならずに最後まで解析を行うことができるというのもNTidyの大きな特長の1つだ。

NTidyを使ったタグの抽出

 NTidyはSourceForgeのNTidyのページからダウンロードできる(NTidy_bin_v1.0.zip)。このzipファイルには「NTidy.dll」というファイルが1つ含まれているだけという、至ってシンプルな構成だ。このNTidy.dllを適当なフォルダに配置して、利用するプロジェクトから参照の追加を行うことで、利用の準備は整う。

■<img>タグの一覧の例

 NTidyの利用例として、ここではHTMLファイルに含まれる<img>タグを一覧表示してみる。そのプログラムは次のようになる。

using System;
using System.Collections.Generic;
using System.Text;
using NTidy;

namespace NTidyTest
{
  class Program
  {
    static void Main(string[] args)
    {
      TidyDocument doc = new TidyDocument();

      doc.SetCharEncoding("shiftjis");
      TidyStatus status = doc.LoadFile(@"D:\test.html");
      doc.CleanAndRepair();

      showImgTag(doc.Body);
    }

    static void showImgTag(TidyNode node) {

      if (node.IsImg) { // ノードが<Img>タグなら
        Console.WriteLine("Name: <{0}>", node.Name);
        Console.WriteLine("IsText: {0}", node.IsText);
        Console.WriteLine("value: [{0}]", node.Value);
      }
      foreach (TidyNode n in node.ChildNodes) {
        showImgTag(n);
      }
    }
  }
}
Imports NTidy

Module Module1

  Sub Main()
    Dim doc As NTidy.TidyDocument
    doc = New NTidy.TidyDocument()

    doc.SetCharEncoding("shiftjis")
    Dim status As TidyStatus = doc.LoadFile("D:\test.html")
    doc.CleanAndRepair()

    showImgTag(doc.Body)

  End Sub

  Sub showImgTag(ByVal node As TidyNode)
    If node.IsImg Then ' ノードが<img>タグなら
      Console.WriteLine("Name: <{0}>", node.Name)
      Console.WriteLine("IsText: {0}", node.IsText)
      Console.WriteLine("value: [{0}]", node.Value)
    End If

    For Each n As TidyNode In node.ChildNodes
      showImgTag(n)
    Next
  End Sub
End Module
NTidyによるimgタグの一覧表示(上:C#、下:VB)

 NTidyでは、まずTidyDocumentクラス(NTidy名前空間)のインスタンスを作成し、エンコードの指定をしてから対象となるHTMLファイルをロードする。その後CleanAndRepairメソッドを実行すると、HTMLファイルの解析(文法チェック)が行われる。

 解析結果は、<head>タグの内容がTidyDocumentオブジェクトのHeadプロパティに、<body>タグの内容がBodyプロパティに、TidyNodeクラス(NTidy名前空間)によって階層的に保持される。TidyNodeクラスには下層につながる要素を示すChildNodesプロパティ(TidyNodeクラス用のコレクションであるTidyChildNodeCollectionクラス)があり、このChildeNodesプロパティをたどっていくことで、HTMLファイル内のすべての要素を走査できる。

 コードでは、HTMLファイルを読み込んだ後、<body>要素を示すTidyNodeオブジェクトをshowImgTagメソッドに渡している。showImgTagメソッドでは、要素が<img>タグならその内容を表示している。そして、さらにすべての子要素に対してshowImgTagメソッドを再帰的に呼び出して、すべての<img>タグをチェックしている。

 要素(TidyNodeオブジェクト)がどのタグかは、TidyNodeクラスのIsXXXプロパティ(XXX部分はタグ名)で判断できる。上記のように、<img>タグの場合は、IsImgプロパティがtrueになる。もし<table>タグなら、IsTableプロパティがtrueになるといった具合だ。また、IsTextプロパティを判断することで、タグを除いたテキスト部分のみを取り出すことも可能である。

 NTidyについての詳細は、本家のTidyのドキュメントを見るのが早い。End of Article

カテゴリ:クラス・ライブラリ 処理対象:HTMLドキュメント
使用ライブラリ:TidyDocumentクラス(NTidy名前空間)
使用ライブラリ:TidyNodeクラス(NTidy名前空間)
使用ライブラリ:TidyChildNodeCollectionクラス(NTidy名前空間)

この記事と関連性の高い別の.NET TIPS
HTMLファイルからテキストを取り出すには?
[ASP.NET]<head>タグの内容を動的に生成するには?
WebBrowserコントロールによりWebページからリンクや画像を抽出するには?
[ASP.NET]任意の画像を出力してブラウザで表示するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間