HTML mit Perl parsen
Nachdem ich das LWP-Tutorial Tutorial geschrieben habe, habe ich mir gesagt, dass man mit den Webseiten doch auch etwas anfangen muss: Deswegen dieses Tutorial über das Parsen von HTML mit Perl. Ich gehe davon aus, dass der HTML-Code schon vorliegt, wer also erst lernen muss, wie man Webseiten mit Perl runterlädt sieht sich bitte das LWP-Tutorial an.
Als erstes müssen wir einen sogenannten Baum (deutsch für tree) aus der HTML-Datei aufbauen. Dazu brauchen wir die HTML::TreeBuilder Klasse und eine Funktion zum initialisieren des Baums:
Init des Baums
#!/usr/bin/perl
- use HTML::TreeBuilder;
$tree = new_from_file("test.html");
Der Baum wird mit dem Inhalt der test.html initialisiert. Stellen wir uns die test.html so vor:
test.html
Um nun auf den Title-Tag zugreifen zu können benötigt man eine spezielle Funktion namens look_down:
Zugriff auf den Title-Tag
#!/usr/bin/perl
use HTML::TreeBuilder;
$tree = new_from_file("test.html");
$title = $tree->look_down("_tag","title");
print $title->as_text;
Durch das look_down(“_tag”,”title”) wird der erste Tag mit dem Namen “title” zurückgegeben. Der Inhalt kann nun mit der Methode as_text ausgeben werden. Dabei werden automatisch alle Tags entfernt. Wer den HTML-Inhalt will, der sollte as_HTML benutzen. Allerdings gibt diese Methode auch den umschließenden Tag zurück.
Das war noch relativ einfach, aber was, wenn man auf den ersten span-Tag mit der id 1 zugreifen möchte – in diesem Fall ganz einfach, der erste span-Tag mit der id 1 ist ja auch der erste span-Tag überhaupt. Aber wenn man so tut, als ob dieser nicht der erste überhaupt wäre, wie kann man Tags nach dem Attribut suchen? Dafür gibt es die Möglichkeit der look_down Anweisung optional eine Subrountine anzugeben, die immer aufgerufen wird, wenn geprüft werden soll ob dies der richtige Tag ist.
Der erste Span mit id='1'
#!/usr/bin/perl
use HTML::TreeBuilder;
$tree = new_from_file("test.html");
$title = $tree->look_down("_tag","title",sub{$_[0]->attr('id')==1});
print $title->as_text;
Hier lernen wir wieder eine neue Funktion kennen: attr gibt den Wert des Attributes, welches man ihm übergibt zurück. Die Subroutine gibt nur wahr zurück wenn id dem Wert 1 entspricht. Um über alle untergeordneten Tags in einem Tag iterieren zu können, gibt es die Methode content_list welche eine Liste aller Tags unterhalb des Tags von dem es aufgerufen wird zurückgibt. Um über alle Tags in Body zu iterieren benutzt man folgende Schleifen:
Alle Tags im Body
Dieses Skript gibt nun alle Inhalte des Bodys im Textformat getrennt von Newlines aus. In diesem Fall hätte man aber auch einfach den Body als Text ausgeben können.



Kommentare
(verstecken) RSSGib deine Meinung ab!