15.9 HTML-Dokumente einlesen 

Liegt ein HTML-Dokument als DOM-Baum vor, hätte das den Vorteil, dass sich das HTML-Dokument einfach untersuchen – etwa mit XPath – oder leicht konvertieren ließe. Das Problem dabei ist nur, dass HTML-Dokumente oft nicht XML-konform sind, also Fehler enthalten. Beim Einlesen würde der strenge XML-Parser Fehler melden und abbrechen.
JTidy
Für HTML-Dokumente, die nicht ganz XML-rein sind, gibt es mit JTidy (http://jtidy.sourceforge.net/) eine freie Bibliothek, die HTML-Dokumente einliest, Fehler (soweit möglich) korrigiert und das XML-Dokument als ordentlichen DOM-Baum repräsentiert. Die Benutzung ist einfach:
Tidy tidy = new Tidy(); // tidy.setMakeClean( true ); // Ohne Störungen // tidy.setXmlTags( true ); // Eingabe als XML behandeln org.w3c.dom.Document node = tidy.parseDOM( in, null );
in steht für einen InputStream, der die Daten bereitstellt. Neben parseDOM(), das ein org.w3c.dom.Document liefert, gibt es auch parse(), dass das Wurzelelement als org.w3c.tidy.Node liefert. Der zweite Parameter von parseDOM() – in unserem Beispiel mit null belegt – steht für ein Ausgabe-Objekt. Wird auf dem Tidy-Objekt die Methode parseXXX(in, out) aufgerufen, so schreibt JTidy einen korrekten XML-Strom in das gegebene OutputStream-Objekt. Unter http://jtidy.sourceforge.net/apidocs/index.html ist die API-Dokumentation verfügbar. Die Lizenz von JTidy ist zwar keine übliche, wie GPL oder Apache, aber trotzdem lässt sich die Bibliothek frei verwenden.
CyberNeko
In einigen Fällen zickt auch JTidy und bricht mit vielen Meldungen ab. Für diesen Fall bietet sich eine Alternative an: der HTML-Parser CyberNeko (http://people.apache.org/~andyc/neko/doc/html/index.html).
InputStream in = new FileInputStream( path ); org.cyberneko.html.parsers.DOMParser parser = new org.cyberneko.html.parsers.DOMParser(); parser.parse( new InputSource(in) );
Um das XML-Dokument als JDOM-Document weiterzuverarbeiten, nutzen wir einen DOMBuilder:
DOMBuilder builder = new DOMBuilder(); org.jdom.Document document = builder.build( parser.getDocument() );
HtmlCleaner
Der HtmlCleaner (http://htmlcleaner.sourceforge.net/) ist eine Bibliothek unter der BSD-Lizenz, die mit Zeilen wie den folgenden eine Eingabe in einen String, Ausgabestrom oder DOM-Baum überträgt:
HtmlCleaner cleaner = new HtmlCleaner( input ); String s = cleaner.getCompactXmlAsString(); cleaner.writeXmlToStream( outputStream ); org.w3c.dom.Document dom1 = cleaner.createDOM(); org.jdom.Document dom2 = cleaner.createJDom();
Der HtmlCleaner kommt ebenfalls mit einem Kommandozeilenprogramm und Ant-Task daher.