|
.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属性が参照できない点には注意が必要だ。
カテゴリ:クラス・ライブラリ 処理対象:HTMLドキュメント
使用ライブラリ:TidyDocumentクラス(NTidy名前空間)
使用ライブラリ:TidyNodeクラス(NTidy名前空間)
使用ライブラリ:TidyChildNodeCollectionクラス(NTidy名前空間)
関連TIPS:HTMLファイルを簡単に解析するには? |
|
generated by
|
|
Insider.NET 記事ランキング
本日
月間