#!/usr/bin/perl use strict; # alles muss definiert sein use warnings; # wenn etwas nicht so ganz richtig ist warnen use diagnostics; # wenn etwas nicht passt ist warnen use File::Find::Rule; # finde Dateien/Verzeichnisse anhand von Regeln use HTML::TokeParser; # parse HTML-Dateien zum leichten auslesen von Daten use DBI; # Das Verzeichnis im dem gesucht werden soll my $search_dir='.'; # ist das aktuelle Arbeitsverzeichnis # die mötigen Werte um dich mit einer Datenbank zu verbinden # ist im Modul alles sehr ausführlich beschrieben # die angefügten Werte sind nur Platzhalter!!! my $dsn="..."; my $user="XXX"; my $password="???"; my $sql_insert = q{ insert into school_tbl (location, name, type, address, description) values (?, ?, ?, ?, ?) }; # Suche nach bestimmten Dateinamen my @files= File::Find::Rule->file() # suche eine Datei ->name('einzelergebnis*.html') # die mit "einzelergebnis" (alles klein geschieben!) beginnt und mit ".html" endet ->in($search_dir); # suche in dem Verzeichnis # das Programm beenden wenn keine Dateien gefunden wurden: unless(@files) { print "Keine Dateien gefunden!\n"; exit; } # mit dem Server verbinden # wie das genau geht steht in der Dokumentation von DBI my $dbh = DBI->connect($dsn, $user, $password, { RaiseError => 1 }) or die($DBI::errstr); my $sth = $dbh->prepare($sql_insert); #gehe alle gefundenen Dateien durch for my $file (@files) { # Ausgabe, damit man weiß waw passiert. print "Bearbeite nun datei: $file!\n"; # Speichrort für die Schuldaten in dieser Datei my %school; # starte seine neue Parser-Instanz mit der Datei als Quelle my $p = HTML::TokeParser->new($file) or die "Can't open $file: ($!)"; #solange ein Tag von Typ 'div' gefunden wird while (my $tag = $p->get_tag('div', '/html')) { # first move to the right div that contains the information last if $tag->[0] eq '/html'; next unless exists $tag->[1]{'id'} and $tag->[1]{'id'} eq 'inhalt_large'; $p->get_tag('h1'); $school{'location'} = $p->get_text('/h1'); while (my $tag = $p->get_tag('div')) { last if exists $tag->[1]{'id'} and $tag->[1]{'id'} eq 'fusszeile'; # get the school name from the heading next unless exists $tag->[1]{'class'} and $tag->[1]{'class'} eq 'fm_linkeSpalte'; $p->get_tag('h2'); $school{'name'} = $p->get_text('/h2'); # verify format for school type $tag = $p->get_tag('span'); unless (exists $tag->[1]{'class'} and $tag->[1]{'class'} eq 'schulart_text') { warn "unexpected format: parsing stopped"; last; } $school{'type'} = $p->get_text('/span'); # verify format for address $tag = $p->get_tag('p'); unless (exists $tag->[1]{'class'} and $tag->[1]{'class'} eq 'einzel_text') { warn "unexpected format: parsing stopped"; last; } $school{'address'} = clean_address($p->get_text('/p')); # find the description $tag = $p->get_tag('p'); $school{'description'} = $p->get_text('/p'); } } # speichere alle gefunden Werte in der DB # das @hash{...} ist ein "HashSlice" $sth->execute(@school{qw{location name type address description}}); } $sth->finish(); $dbh->disconnect();