HTML mit jsoup parsen

Information aus HTML zu extrahieren ist eine mühsame Angelegenheit. Will man den Inhalt der HTML Datei dann auch noch editieren, wird es noch komplizierter.

Die Bibliothek, welche ich vorstellen möchte, löst das Problem sehr elegant: http://jsoup.org/

Jsoup ist in der Lage, mit einem sehr einfachen API alle Formen von HTML zu parsen. Von sich selbst behauptet es, für real-world HTML geeignet zu sein. Und tatsächlich können sich Entwickler nicht darauf verlassen, dass die zu parsende HTML-Dateien immer ein valides Format aufweisen.

jsoup funktioniert sehr gut

In diesem Beispiel versuchen wir, eine Wikipedia-Seite zu parsen und die Besetzung des Films 2001 Odyssee im Weltraum herauszufiltern. Google Chrome hilft uns wunderbar dabei, den HTML-Baum zu analysieren und so zu erkennen, wo unsere Informationen verborgen sind.

Die HTML-Datei näher betrachtet

Wir finden folgende Struktur, eine Tabellenzeile mit dem Inhalt “Besetzung”. Die nachfolgende Tabellenzeile scheint die tatsächliche Liste der Besetzung zu beinhalten

<tr><th colspan=”2″ style=”padding:4px; background-color:#E6E6FA; border-top:1px solid #B1B9C9;”><span style=”font-weight:normal;”>Besetzung</span></th></tr>

<tr>

<td colspan=”2″ style=”padding:0 5px;”>

<ul>

<li><a href=”/wiki/Keir_Dullea” title=”Keir Dullea”>Keir Dullea</a>: Dr. David „Dave“ Bowman</li>

<li><a href=”/wiki/Gary_Lockwood” title=”Gary Lockwood”>Gary Lockwood</a>: Dr. Frank Poole</li>

</ul>

</td>

</tr>

Das wollen wir erreichen

  1. Document parsen
  2. Das <span> Element finden, welches den Text Besetzung enthält
  3. Von diesem Element hangeln wir uns zu der Tabellenzeile <tr>, welche die Besetzung enthält
  4. Von diesem Element lesen wir alle <li> Elemente und geben deren Inhalt aus

// Zuerst parsen wir die Seite. Das geschieht ganz einfach:

Document doc = Jsoup.connect(“http://de.wikipedia.org/wiki/2001:_Odyssee_im_Weltraum“).get();

// Suchen das <span> Element

Element span = doc.getElementsContainingOwnText(“Besetzung”).first();

// Navigieren zum richtigen <tr> Element

Element trWithCast = span.parent().parent().nextElementSibling();

// Die <li> Elemente lesen und über diese iterieren

Elements elementsByTag = trWithCast.getElementsByTag(“li”);

for (Element liElement : elementsByTag) {

System.out.println(liElement.text());

}

Der Output

Keir Dullea: Dr. David „Dave“ Bowman

Gary Lockwood: Dr. Frank Poole

William Sylvester: Dr. Heywood R. Floyd

Douglas Rain (engl.), Peter Schiff (dt.): Stimme von HAL 9000

Robert Beatty: Dr. Ralph Halvorsen

Leonard Rossiter: Dr. Andrei Smyslov

Margaret Tyzack: Elena

Sean Sullivan: Dr. Bill Michaels

Viel Spass beim Ausprobieren von jsoup!

Leave a Reply