Lionstarrs Linux Blog

Ein Blog über Linux und die Welt

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

  1. #!/usr/bin/perl

  2. use HTML::TreeBuilder;
  3. $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

  1. <html>

  2. <head>

  3. <title>Das ist der Title</title>

  4. </head>

  5. <body>

  6. <span id='1'>Span 1</span>

  7. <span class='schoen'>Schoener Span</span>

  8. </body>

  9. </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

  1. #!/usr/bin/perl

  2. use HTML::TreeBuilder;

  3. $tree = new_from_file("test.html");

  4. $title = $tree->look_down("_tag","title");

  5. 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'

  1. #!/usr/bin/perl

  2. use HTML::TreeBuilder;

  3. $tree = new_from_file("test.html");

  4. $title = $tree->look_down("_tag","title",sub{$_[0]->attr('id')==1});

  5. 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

  1. #!/usr/bin/perl

  2. use HTML::TreeBuilder;

  3. $tree = new_from_file("test.html");

  4. $body = $tree->look_down("_tag","body");

  5. @tags = $body->content_list;

  6. foreach $tag(@tags){

  7. print $tag->as_text;

  8. print "n";

  9. }

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.

In: , ,
— January 26, 2007


Kommentare

(verstecken)
      RSS
Leider gibt es bis jetzt keine Kommentare!

Gib deine Meinung ab!


(notwendig)






Stoppt die Vorratsdatenspeicherung! Jetzt klicken & handeln!Willst du auch bei der Aktion teilnehmen? Hier findest du alle relevanten Infos und Materialien: