|
110 | Perl-Snapshot Mike Schilli bastelt eine Bewässerungsanlage für Balkonpflanzen.
114 | Rubygems Ruby-Pakete einfach installieren und selber schnüren.
|
Wer Informationen von Webseiten anderer holen möchte, hat oft ein schweres Los: Trotz Standards sieht der HTML-Quelltext aus wie Kraut und Rüben, selbst geschriebene Parser versagen schon angesichts nur kleiner Änderungen an den HTML-Seiten. Besser und einfacher geht's mit fertigen Bibliotheken, die fehlertolerant sind und praxisorientierte Heuristiken anwenden statt kleinkariert auf standardkonformer Syntax zu bestehen.
Python-Programmierer finden einen solchen Baukasten in Beautiful Soup [1], das seinen Namen aus Lewis Carrolls Roman "Alice im Wunderland" bezieht. Neben seinen fehlertoleranten Parsing-Fähigkeiten bietet das Paket die transparente Umwandlung des auf der Website verwendeten Zeichensatzes in UTF-8. Das befreit den Programmierer nicht zuletzt von der lästigen Aufgabe, sich auch noch um den Wildwuchs an Character-Sets zu kümmern.
Auf der Website bietet Programmierer Leonard Richardson seine Bibliothek als einzelne Datei oder als Teil eines Tar-File an, das zusätzlich ein Install-Skript und Unit-Tests enthält. Um das Modul zu verwenden, bleibt nichts zu tun, außer es in eigene Skripte mit »from BeautifulSoup import BeautifulSoup« zu importieren. Liegt die HTML-Datei in einer Variablen »html« vor, parst Beautiful Soup sie über die Anweisung »soup = BeautifulSoup(html)«. Um die HTML-Daten von einer echten Website zu erhalten, verwenden Python-Programmierer am besten das in jeder Distribution enthaltene Modul »urllib«. Die Meta-Informationen einer Seite liefert die Bibliothek zum Beispiel über »soup.head«, »soup.head.title« und so fort. Wer den auf diese Weise verarbeiteten HTML-Wust einfach nur schön formatiert ausgeben möchte, findet in »soup.prettify()« die passende Python-Methode.
Wer suchet ...
Um alle Elemente eines Typs in einer Seite zu finden, bietet Beautiful Soup die Methode »findall()«. Zum Beispiel gibt »soup.findall("a")« alle Links (Anchors) zurück. Um die Suche einzugrenzen, versteht die Methode Tag-Attribute, die als zweiter Parameter folgen können. Schließlich sucht »findall()« auf Wunsch auch nach dem Inhalt von Tags. So liefert »find()« einfach das nächste Tag des gesuchten Typs im Dokument.
Die meisten Methoden verarbeiten nicht nur einfache Argumente, sondern auch Lambda-Funktionen, die beliebig komplexe Suchanfragen möglich machen. So sucht die folgende Abfrage nach Tags, die genau zwei Attribute besitzen:
soup.findAll(lambda tag: len(tag.attrs) == 2)
Nun wäre es ziemlich mühsam, alle Tags eines Typs zu suchen und sie dann quasi von Hand weiterzuverarbeiten. Statt dessen bietet Beautiful Soup die Möglichkeit, erhaltene Ergebnisse mit den gleichen Mitteln zu durchsuchen. Einen Schritt weiter führt das systematische Hangeln entlang des DOM-Baums oder in Beautiful Soups so genannten Parsetrees. Beispiele für entsprechende Methoden sind »findNextSiblings()«, »findPreviousSiblings()« oder »findParents()«. Ähnlich funktionieren Attribute, die viele Elemente des Parse-Baums besitzen, zum Beispiel »parent«. Die umfangreiche Dokumentation liefert eine ganze Reihe weiterer Anwendungsbeispiele für die Methoden von Beautiful Soup.
Abbildung 1: Lewis Carrolls Roman „Alice im Wunderland“ stand Pate für den Namen der praktischen Bibliothek Beautiful Soup.
Neben HTML-Dokumenten verarbeitet Beautiful Soup auch XML-Dateien. Dazu muss der Python-Programmierer nur das Modul »BeautifulStoneSoup« importieren und dann verfahren wie beschrieben. Wer mit Python auf Kriegsfuß steht, findet vielleicht in der Ruby-Bibliothek Rubyful Soup [2] desselben Autors die passende Lösung. Auch das anfangs geschilderte Problem der fehlenden RSS-Feeds hat Leonard Richardson schon gelöst: Sein Paket Scrape'n'Feed [3] benutzt seine Bibliothek, um HTML-Seiten zu verarbeiten und aus ihnen standardkonforme RSS-Feeds zu erzeugen.
Copyright © 2002 Linux New Media AG