先日、ベータ版をリリースしましたSEO分析ツール「Crete」では、キーワードが含まれているタグを判別するためにHTML解析を行っています。
実は、「Crete」の開発の中では最も時間がかかったのはこの部分でした。
せっかくなので是非ご活用していただきたくライブラリ化したので、使い方をご紹介します。
ライブラリは以下の6つのファイルで構成されています。名前空間は「CreteLib」です。
・HtmlDocument.cs ・・HTMLドキュメントを表すクラス
・HtmlNode.cs ・・HTMLの要素を表すクラス
・HtmlTextNode.cs ・・HTMLの要素の中で、タグにはさまれたテキスト部分を表すクラス
・HtmlNodeList.cs ・・ノードのリスト
・HtmlParser.cs ・・HTMLを解析するクラス。内部的に利用しているクラスなので直接利用する必要はありません。
・NodeType.cs ・・ノードの種類を表す列挙体
使い方は非常に簡単です。以下のコードでHTMLを解析することが出来ます。
解析が完了したら、HtmlDocumentクラスのインスタンスから必要な情報を取り出すことができます。
GetNodesByTagName(String tagName)は、引数に指定されたタグ名のノードの一覧を返すメソッドです。
タグ名の指定は、大文字、小文字を問いません。
以下のコードは、aタグの一覧を取得し、そのhref属性をコンソールに表示するサンプルです。
属性の値により、ノードの一覧を取得するGetNodesByAttribute()があります。
Htmlのノードには、HtmlNodeクラスとHtmlTextNodeクラスがありHtmlTextNodeクラスがHtmlNodeクラスを継承しています。
HtmlNodeクラスは、HTMLのタグ要素を表し、HtmlTextNodeはタグに挟まれたテキスト部分を表します。
HtmlNodeクラスは、TagNameやAttributes(属性)、ChildNodes(子ノードのリスト)、InnerText(タグに挟まれた文字列)などのプロパティが
あります。ChildNodesを移動していくことで、HTMLのツリー構造を解析することができます。
InnerTextは、ChildNodesを連結したものです。
以下にHtmlTextNodeクラスのText属性との違いを例示します。
HtmlTextNodeのテキスト属性には、それぞれ「テキスト1」や「テキスト2」が格納されています。
一方、divタグのInnterTextには「テキスト1<br>テキスト2」が格納されます。ただし、さらに子供の要素
をもつタグについては無視しています。
ライセンスフリーでソースも公開していますので、是非お使いください。
バグやご要望、なんでもかまいませんのでフィードバックいただけるとうれしいです。
CreteLibのダウンロード
ソースのダウンロード
実は、「Crete」の開発の中では最も時間がかかったのはこの部分でした。
せっかくなので是非ご活用していただきたくライブラリ化したので、使い方をご紹介します。
ライブラリは以下の6つのファイルで構成されています。名前空間は「CreteLib」です。
・HtmlDocument.cs ・・HTMLドキュメントを表すクラス
・HtmlNode.cs ・・HTMLの要素を表すクラス
・HtmlTextNode.cs ・・HTMLの要素の中で、タグにはさまれたテキスト部分を表すクラス
・HtmlNodeList.cs ・・ノードのリスト
・HtmlParser.cs ・・HTMLを解析するクラス。内部的に利用しているクラスなので直接利用する必要はありません。
・NodeType.cs ・・ノードの種類を表す列挙体
使い方は非常に簡単です。以下のコードでHTMLを解析することが出来ます。
String source = "<html><body>HTML解析</body></html>"; HtmlDocument doc = new HtmlDocument(); doc.Load(source);
解析が完了したら、HtmlDocumentクラスのインスタンスから必要な情報を取り出すことができます。
GetNodesByTagName(String tagName)は、引数に指定されたタグ名のノードの一覧を返すメソッドです。
タグ名の指定は、大文字、小文字を問いません。
以下のコードは、aタグの一覧を取得し、そのhref属性をコンソールに表示するサンプルです。
HtmlNodeList nodeList = doc.GetNodesByTagName("a");
foreach (HtmlNode node in nodeList)
{
Console.WriteLine("node:{0}", node["href"]);
}
HtmlDocumentクラスには他にも、タグに含まれるテキストによりノードの一覧を取得するGetNodesByText()や属性の値により、ノードの一覧を取得するGetNodesByAttribute()があります。
Htmlのノードには、HtmlNodeクラスとHtmlTextNodeクラスがありHtmlTextNodeクラスがHtmlNodeクラスを継承しています。
HtmlNodeクラスは、HTMLのタグ要素を表し、HtmlTextNodeはタグに挟まれたテキスト部分を表します。
HtmlNodeクラスは、TagNameやAttributes(属性)、ChildNodes(子ノードのリスト)、InnerText(タグに挟まれた文字列)などのプロパティが
あります。ChildNodesを移動していくことで、HTMLのツリー構造を解析することができます。
InnerTextは、ChildNodesを連結したものです。
以下にHtmlTextNodeクラスのText属性との違いを例示します。
<div> ・・HtmlNode テキスト1 ・・HtmlTextNode <br> ・・HtmlNode テキスト2 ・・HtmlTextNode </div>
HtmlTextNodeのテキスト属性には、それぞれ「テキスト1」や「テキスト2」が格納されています。
一方、divタグのInnterTextには「テキスト1<br>テキスト2」が格納されます。ただし、さらに子供の要素
をもつタグについては無視しています。
ライセンスフリーでソースも公開していますので、是非お使いください。
バグやご要望、なんでもかまいませんのでフィードバックいただけるとうれしいです。
CreteLibのダウンロード
ソースのダウンロード
コメント
コメントの投稿
トラックバック
http://csfun.blog49.fc2.com/tb.php/19-5f4997c1


