2010年01月06日

【Java】HtmlCleanerを使ってみる

HtmlCleanerとは、SourceForge.JPの説明によると

HtmlCleaner HTMLパーサを、Javaで書かれている。それは十分には、ブラウザでは、ほとんどのWeb利用と同じ規則に次のXMLが形成された汚れのHTMLに変換します。

http://sourceforge.jp/projects/sfnet_htmlcleaner/

ドンマイ、機械翻訳

真面目に説明すると、HtmlCleanerとはオープンソースのピュアJavaなHTMLパーサで、腐ったHTMLを綺麗なXMLに変換してくれます。

SourcefogeのURLからZIPを落として来て、自分はEclipseユーザなので解凍した中にあるjarをbuild pathに含めて使用しました。

以下、サンプル。


import java.io.IOException;
import java.io.StringWriter;

import org.htmlcleaner.CleanerProperties;
import org.htmlcleaner.HtmlCleaner;
import org.htmlcleaner.PrettyXmlSerializer;
import org.htmlcleaner.TagNode;
import org.htmlcleaner.XmlSerializer;

public class Test {

public static void main(String[] args) {
// cleanerの生成
HtmlCleaner cleaner = new HtmlCleaner();
CleanerProperties props = cleaner.getProperties();

// 腐ったHTML
String kusattaHtml =
"<html>" +
"<title>タイトル</title>" +
"<body>" +
"<table>" +
"<td>テスト</td>" +
"</html>";

try {
// Cleanerの実行
TagNode node = cleaner.clean( kusattaHtml );

// XMLに変換してStringWriterに
XmlSerializer serializer = new PrettyXmlSerializer( props );
StringWriter writer = new StringWriter();
serializer.writeXml(node, writer, "utf-8");

// コンソールに出力
System.out.println( writer.getBuffer() );
writer.close();

} catch(IOException e) {
e.printStackTrace();
}

}
}


実行結果

<?xml version="1.0" encoding="utf-8"?>
<html>
<head>
<title>タイトル</title>
</head>
<body>
<table>
<tbody>
<tr>
<td>テスト</td>
</tr>
</tbody>
</table>
</body>
</html>


なんということでしょう。あの腐っていたHTMLが見事に整形されています。

ちなみに今回使用したのはPrettyXmlSerializer。この子は綺麗にインデントをして結果を返してくれます。

Serializerには他に、SimpleSerializer(特にインデントやtrimはしないで、現状を維持して返す)や、CompactXmlSerializer(trimしてコンパクトな状態で返す)などがいます。

その他にも、CleanerPropertiesにいろいろ設定することで、Serializeの形式を変更したりできます。ScriptやStyleタグをCDATAで囲むかどうかとか、Unknownなタグを除外するかとか。

詳しくはここに一覧が載っています
http://htmlcleaner.sourceforge.net/parameters.php