top / index / prev / next / target / source

2007-08-23 diary: Javaで実装された HTML Parser (HTMLパーサ) を調べてみました

いがぴょんの日記 日記形式でつづる いがぴょんコラム ウェブページです。

old-v2

Javaで実装された HTML Parser (HTMLパーサ) を調べてみました

Javaで実装された HTML Parser について オープンソースのもの限定で幾つか調べてみました。

Javaで実装された HTML Parser (HTMLパーサ) を調べてみました

Javaで実装された HTML Parser について オープンソースのもの限定で幾つか調べてみました。

このリスト作成のために参考にさせていただいたページは下記です。

なまえ 情報源 ライセンス 最終更新日 メモ HTML Parser

LGPL CPL 2006.07.10 (1.6) 書き出し機能あり。 HTML整形機能あり。 リンクなどのハンドリングも得意そう。 Jericho HTML Parser

LGPL EPL 2007.05.20 (2.4) HTMLに加えて JSPなどのサーバサイドタグにも対応。書き出し機能あり。HTML整形機能あり。APIの使い勝手が私好みっぽい。 HtmlCleaner

BSD 2007.07.12 (1.3) HTML整形機能が売り。jarファイルが小さい。タグをカスタムする差込口があり。 Java Mozilla Html Parser

GPL LGPL MPL 2007.07.30 (0.1.7) Javaに加え C言語を利用。 CyberNeko HTML Parser

BSD風 と思われる 2005.07.18 (0.9.5)

JTidy

独自 2001.08.01 (04aug2000r7-dev)

javax.swing.text.html.parser

Java純正HTMLパーサ

このうち、基本的仕様やライセンスの都合 (私は LGPLであるほうが都合良い) などから HTML Parser と Jericho HTML Parser とに着眼し、HTMLフォーマッタの機能を簡単に試しました。

HTML Parserによる HTMLフォーマッティングの実装例 FormatHtmlSample.java

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

import org.htmlparser.util.Translate;

/**
 * HTML ParserのHTML整形実行サンプル。
 */
public class FormatHtmlSample {
    static final String ENCODING = "EUC-JP";

    static String fileToString(final String targetFileName) throws IOException {
        final StringBuffer result = new StringBuffer();

        final BufferedReader reader = new BufferedReader(new InputStreamReader(
                new FileInputStream(targetFileName), ENCODING));
        try {
            for (;;) {
                final String wrk = reader.readLine();
                if (wrk == null) {
                    break;
                }
                result.append(wrk);
            }
        } finally {
            reader.close();
        }
        return result.toString();
    }

    static void writeHtml(final String htmlText, final String targetFileName)
            throws IOException {
        final BufferedWriter writer = new BufferedWriter(
                new OutputStreamWriter(new FileOutputStream(targetFileName),
                        ENCODING));
        try {
            writer.write(htmlText);
        } finally {
            writer.close();
        }
    }

    public static void main(final String[] args) {
        try {
            final String htmlText = fileToString("blancofw.htm");
            final String decodedHtmlText = Translate.decode(htmlText);
            writeHtml(decodedHtmlText, "aaa.htm");
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

Jericho HTML Parserによる HTMLフォーマッティングの実装例 JerichoFormatHtmlSample.java

import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.URL;

import au.id.jericho.lib.html.MasonTagTypes;
import au.id.jericho.lib.html.PHPTagTypes;
import au.id.jericho.lib.html.Source;
import au.id.jericho.lib.html.SourceFormatter;

/**
 * Jericho HTML ParserのHTML整形実行サンプル。
 */
public class JerichoFormatHtmlSample {
    void process(final String sourceUrlString, final String targetFileName)
            throws IOException {
        final Source htmlSource = new Source(new URL(sourceUrlString));

        final SourceFormatter formatter = htmlSource.getSourceFormatter();
        formatter.setIndentString(" ");
        formatter.setTidyTags(true);

        final BufferedWriter writer = new BufferedWriter(
                new OutputStreamWriter(new FileOutputStream(targetFileName),
                        htmlSource.getEncoding()));
        formatter.writeTo(writer);
        writer.close();
    }

    public static void main(final String[] args) {
        PHPTagTypes.register();
        MasonTagTypes.register();

        try {
            new JerichoFormatHtmlSample().process("file:blancofw.htm",
                    "aaa.htm");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

ちょびっと書いてみただけの感じだと、私は Jericho HTML Parserのコーディングスタイルが好みっぽいように感じました。とりあえずざっくりと触った初見の感想です。もっと使ってみると異なる感触になる可能性があります。


この日記について