13.7 HTML-Dokumenten mit JTidy und cyberneko einlesen
 
Liegt ein HTML-Dokument als DOM-Baum vor, so hätte das den Vorteil, dass man das HTML-Dokument einfach untersuchen kann – etwa mit XPath – oder leicht konvertieren könnte. 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.
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 intern (soweit möglich) korrigiert und 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(), was ein org.w3c.dom.Document liefert, gibt es auch parse(), was das Wurzelelement als org.w3c.tidy.Node liefert. Der zweite Parameter – hier 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. Online ist die API-Dokumentation unter http://jtidy.sourceforge.net/apidocs/index.html verfügbar.
Die Lizenz von JTidy ist zwar keine übliche, wie GPL oder Apache, aber trotzdem lässt sich die Bibliothek frei verwenden. Die Seite http://jtidy.sourceforge.net/license.html erklärt das genauer.
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 von cyberneko (http://www.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() );
|