AsanHtmlParserとは?
AsanHtmlParserとは、A-sanが作ったHTMLパーサです。
世の中の多くのHTMLパーサは、DOMツリー的なものを構築し返しますが、
AsanHtmlParserはタグやテキストのリストを返します。
そのため構造的に正しくないHTMLでも解析して扱うことができます。
WebブラウザやHTMLエディタを作るにはこれでは不十分ですが、
HTML内のリンクやテキストを抽出するにはこれで十分です。
また、AsanHtmlParserは、タグやテキストを解析しますが、
そのタグの意味するところまでは解析していません。
例えば img タグには src属性がありますが、そのようなチェックは行っていません。
逆に言えば、HTMLっぽい文法ならば解析できる可能性があります。
HTMLに新しいタグが導入されても解析できると期待できます。
使い方
インストール
ダウンロードしたzipファイルを任意のディレクトリに解凍します。
lib/AsanHtmlParser.jar を クラスパスに追加して使います。
サンプル:SimpleSample
Yahooのホームページ(http://www.yahoo.co.jp/)を取得し、解析して結果を表示します。
package samples;
import java.net.URL;
import java.util.ArrayList;
import asanhtmlparser.HtmlParser;
public class SimpleSample {
public static void main(String[] args) throws Exception {
// 解析したいURL
URL url = new URL("http://www.yahoo.co.jp/");
// HtmlParserを作成。
HtmlParser parser = new HtmlParser();
// 指定したURLを解析し、解析結果を取得する。
ArrayList tagList = parser.parse(url);
// 解析結果を出力する。
for (int i=0; i<tagList.size(); i++) {
System.out.println(tagList.get(i));
}
}
}
出力結果は以下のとおりです。
C:\home\AsanHtmlParser\samples>javac -cp ../lib/AsanHtmlParser.jar SimpleSample.java
C:\home\AsanHtmlParser\samples>java -cp .;../lib/AsanHtmlParser.jar SimpleSample
Element[68796784898069327284777632808566767367323445474787516747476884683272847776325246484932841149711011510511610511111097108474769783432341041161161125847471191191194611951461111141034784824710411610910852471081111111151014610011610034 SINGLE attributes={}]
Text["\n"]
Element[html OPEN attributes={}]
Text["\n"]
Element[head OPEN attributes={}]
Text["\n"]
Element[meta OPEN attributes={http-equiv="content-type"; content="text/html; charset=utf-8"}]
Text["\n"]
Element[meta OPEN attributes={http-equiv="content-style-type"; content="text/css"}]
Text["\n"]
Element[meta OPEN attributes={http-equiv="content-script-type"; content="text/javascript"}]
Text["\n"]
Element[meta OPEN attributes={name="description"; content="日本最大級のポータルサイト。検索、オークション、ニュース、メール、コミュニティ、ショッピング、など80以上のサービスを展開。あなたの生活をより豊かにする「ライフ・エンジン」を目指していきます。"}]
Text["\n"]
Element[title OPEN attributes={}]
Text["Yahoo! JAPAN"]
Element[title CLOSE attributes={}]
Text["\n \n"]
Element[base OPEN attributes={href="http://www.yahoo.co.jp/_ylh=X3oDMTB2OHNyYWxqBF9TAzIwNzkxODE5OTkEdGlkAzEzBHRtcGwDdGFibGU-/"; target="_top"}]
Text["\n"]
Element[style OPEN attributes={type="text/css"}]
Text["\n"]
...
クラス図
HtmlParserクラスは構文解析を行うと、IHtmlNodeインターフェースのリストを生成し返します。
実際に生成されるクラスはIHtmlNodeインターフェースを実装する以下の4つのクラスのいずれかです。
HtmlElement
body や imgなどのタグです。
また、<!DOCTYPE ...> もHtmlElementになります。
メンバとして、タグ名、タグのタイプ、属性名のリスト、属性名と属性値のマップを保持します。
タグのタイプには以下の3つがあります。
OPEN_TAG | "<TAG>" 形式のタグ. |
CLOSE_TAG | "</TAG>" 形式のタグ. |
SINGLE_TAG | "<TAG/>" 形式のタグ. |
HtmlText
テキストをあらわします。
メンバとしてテキストの内容を保持します。
HtmlComment
HTMLのコメントをあらわします。
メンバとしてコメントの内容を保持します。
HtmlError
HTMLで解析できなかった場合、そのエラー箇所の内容をあらわします。
正常なHTMLの場合はこれを返すことはありません。
< と > の対応が取れていなかったり、属性の文字列で引用符の終わりが見つからなかったり、
ファイルが途中で切れていた場合などに発生します。
また、文字コードの指定がなく、文字コードの判定に失敗した場合でも発生する可能性があります。
メンバとしてエラー箇所のソースの内容、およびHtmlParserException(エラーメッセージ含む)を保持します。
その他のサンプル
samplesディレクトリには、以下のサンプルがあります。
SimpleSample | 上記のサンプル |
Html2Text | 指定されたURLのHTMLからテキストを抽出する |
LinkCollector | 指定されたURLのHTMLからAタグのhrefで指定されているリンクを抽出する |
ImageCollector | 指定されたURLのHTMLからIMGタグの画像をファイルに保存する |
ImageCollector2 | 指定されたURLのHTMLからAタグでリンクされた画像をファイルに保存する |
プロキシ環境での使用
プロキシのある環境では外部のサイトのコンテンツが正しく取得できない場合があります。
その場合は、JavaVMの引数にあらかじめプロキシのアドレスとポートを指定してみてください。
Java起動時に以下の2つのVM引数を渡します。
>java -Dhttp.proxyHost=<プロキシサーバのアドレス> -Dhttp.proxyPort=<プロキシサーバのポート番号> ...
引数で渡す代わりに、プログラムで同様のことができます。
ネットワークにアクセスする前に以下の設定を行ってください。
System.setProperty("http.proxyHost", "133.166.xxx.xxx"); // プロキシサーバのアドレス
System.setProperty("http.proxyPort", "80xx"); // プロキシサーバのポート番号
これは、AsanHtmlParserに限らず、java.netパッケージを使ってアクセスする場合に有効です。
参考
http://java.sun.com/javase/ja/6/docs/ja/technotes/guides/net/proxies.html
動作環境
JRE1.4以上
ライセンス
GNU LGPLv3(GNU Lesser General Public License Version 3)
原文
日本語訳
ホームページ
asanhtmlparser@SOURCEFORGE.JP