.NET TIPS

HTMLファイルからテキストを取り出すには?[C#、VB]

デジタルアドバンテージ 岸本 真二郎
2009/04/09

 「TIPS:HTMLファイルを簡単に解析するには?」では、HTMLファイルに含まれるタグの処理を行う際に、オープンソースのライブラリである「NTidy」が利用できることを紹介した。同じくNTidyを使えば、HTMLからタグを除いたテキストだけを抽出することも可能だ(NTidyの入手やプロジェクトでの利用方法については上記の記事を参考にしていただきたい)。

 NTidyでは、HTMLから生成されるDOM(Document Object Model)に含まれるノードを示す各クラスに、IsTitle、IsH1、IsImg(すべてBool型)といった、HTMLタグの種類に対応するプロパティが用意されている。この中には「IsText」というプロパティがあり、これがtrueのノードは、テキストを含んでいるノードである。そのため、そのようなノードをすべて集めることで、HTMLファイルに記述されたテキスト部分(タグ以外の部分)を抽出できるというわけだ。

 以下に、HTMLファイルのファイル名を引数として受け取り、戻り値として、それに含まれるテキストを返す処理(GetHtmlTextメソッド)の記述例を示す。

using NTidy;

class Html2Text
{
  // ノードを再帰的にチェックする
  private void traceTag(TidyNode node, ref string sResult)
  {
    if (node.IsText) {
      sResult += node.Value;
    }

    foreach (TidyNode n in node.ChildNodes) {
      if (!n.IsScript) {
        traceTag(n, ref sResult);
      }
    }
  }

  // HTMLファイルを開いて、テキストを取得する
  public string GetHtmlText(string fname)
  {
    string sResult = "";
    TidyStatus status;

    TidyDocument doc = new TidyDocument();
    doc.SetCharEncoding("shiftjis");
    status = doc.LoadFile(fname);

    status = doc.CleanAndRepair(); // HTMLを解析
    traceTag(doc.Body, ref sResult);
    return sResult;
  }
}
Imports NTidy

Class Html2Text

  ' ノードを再帰的にチェックする
  Private Sub traceTag(ByVal node As TidyNode, ByRef sResult As String)
    If node.IsText Then
      sResult += node.Value
    End If

    For Each n As TidyNode In node.ChildNodes
      If Not n.IsScript Then
        traceTag(n, sResult)
      End If
    Next
  End Sub

  ' HTMLファイルを開いて、テキストを取得する
  Public Function GetHtmlText(ByVal fname As String) As String

    Dim sResult As String = ""
    Dim status As TidyStatus
    Dim doc As New TidyDocument()

    doc.SetCharEncoding("shiftjis")
    status = doc.LoadFile(fname)

    status = doc.CleanAndRepair() ' HTMLを解析
    traceTag(doc.Body, sResult)
    Return sResult
  End Function
End Class
NTidyによりHTMLファイルからテキスト部分を取り出す(上:C#、下:VB)

 ここでは、<body>タグのノードを起点としてtraceTagメソッドを呼び出し、ノードを再帰的にチェックして、IsTextプロパティがtrueのノードに含まれるすべてのテキストを取得している。

 なお、CSSを利用したWebページでは、<div>タグのid属性やclass属性を使って、メニューやナビゲーションなどのテキストとページ本文とを分離する場合が多い。このようなページでは、<div>タグのid属性(TidyNode.Attributes.IDプロパティ)を参照することで、任意の<div>タグに含まれるテキストを取り出すことができる。ただしNTidyの仕様が若干古いせいか(リリースは2004年で止まっている)、class属性が参照できない点には注意が必要だ。End of Article

カテゴリ:クラス・ライブラリ 処理対象:HTMLドキュメント
使用ライブラリ:TidyDocumentクラス(NTidy名前空間)
使用ライブラリ:TidyNodeクラス(NTidy名前空間)
使用ライブラリ:TidyChildNodeCollectionクラス(NTidy名前空間)
関連TIPS:HTMLファイルを簡単に解析するには?

この記事と関連性の高い別の.NET TIPS
HTMLファイルを簡単に解析するには?
TreeViewコントロールで効率的にツリーを構築するには?
TreeViewコントロールへ項目を追加するには?
[ASP.NET]TreeViewコントロールで深階層のツリー情報を効率よく読み込むには?
TreeViewコントロールで現在選択されているノードを変更するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム 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 記事ランキング

本日 月間