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"]
...

クラス図
class diagram

HtmlParserクラスは構文解析を行うと、IHtmlNodeインターフェースのリストを生成し返します。 実際に生成されるクラスはIHtmlNodeインターフェースを実装する以下の4つのクラスのいずれかです。

  • HtmlElement
  • HtmlText
  • HtmlComment
  • HtmlError

    その他のサンプル

    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