top / index / prev / next / target / source

2017-01-18 diary: [Java] TagSoup を利用した HTML 正常化のシンプルサンプル

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

[Java] TagSoup を利用した HTML 正常化のシンプルサンプル

TagSoup を利用した HTML 正常化(ウェル・フォームドにする)のシンプルサンプルを示します。 10年ぶりに HTML 正常化の Java 実装を探してみましたが、いまでも TagSoup が現役で、そして世間一般の評価が高い模様です。

土台となる Maven Java プロジェクトの新規作成

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>

Java コードの記述

以下のコードにより、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&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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 などを利用した読み書きが可能になります。

関連する日記

登場キーワード


この日記について