top / index / prev / next / target / source
日記形式でつづる いがぴょんコラム ウェブページです。
TagSoup
を利用した HTML 正常化(ウェル・フォームドにする)のシンプルサンプルを示します。 10年ぶりに HTML 正常化の Java 実装を探してみましたが、いまでも TagSoup が現役で、そして世間一般の評価が高い模様です。
2017-01-02 diary: [Maven] によるシンプル Java プロジェクトサンプルの作成手順 に従い Maven Java プロジェクトを新規作成します。
pom.xml
の <build>
に手順通りの記載を追加します。
そして、pom.xml
の <dependencies>
には以下の記述を追加します。
<dependency>
<groupId>org.ccil.cowan.tagsoup</groupId>
<artifactId>tagsoup</artifactId>
<version>[1.2.1,2.0)</version>
</dependency>
以下のコードにより、HTML をウェルフォームドな XML に変換することができます。
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import org.ccil.cowan.tagsoup.HTMLSchema;
import org.ccil.cowan.tagsoup.Parser;
import org.ccil.cowan.tagsoup.XMLWriter;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
public class App {
public static void main(final String[] args) throws IOException, SAXException {
final XMLReader parser = new Parser();
parser.setProperty(Parser.schemaProperty, new HTMLSchema());
final StringWriter output = new StringWriter();
final XMLWriter serializer = new XMLWriter(output);
parser.setContentHandler(serializer);
parser.setFeature(Parser.namespacesFeature, false);
parser.setFeature(Parser.defaultAttributesFeature, false);
parser.setFeature("http://www.ccil.org/~cowan/tagsoup/features/ignore-bogons", false);
final InputSource input = new InputSource();
input.setCharacterStream(new StringReader("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n"
+ "<HTML><head>\n" + "<title>this is title\n"
+ "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n" + "<body>\n"
+ "<p>aaa<br>bbb<p>あいうAAA BBB CCC<uso>\n"
+ "</html>"));
serializer.setOutputProperty(XMLWriter.METHOD, "xhtml");
serializer.setOutputProperty(XMLWriter.OMIT_XML_DECLARATION, "yes");
serializer.setOutputProperty(XMLWriter.ENCODING, "UTF-8");
parser.parse(input);
System.err.println("Result: [" + output.toString() + "]");
}
}
これを実行するのは以下のコマンドです。
mvn install exec:java
TagSoup を利用して、HTML を ひとたび XML に変換さえしてしまえば、あとは XPath などを利用した読み書きが可能になります。