Jemand zu Hause?Leser: 22
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
#!/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 # Array in der alle Schulen mit ihren Daten gespeichert werden sollen my @schools; # Das Verzeichnis im dem gesucht werden soll my $search_dir='.'; # ist das aktuelle Arbeitsverzeichnis # die Datei in die alles gespeichert werden soll my $out_file='./output.xml'; # 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 #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 eine refenz auf den Hash mit den Daten der aktuellen Schule im Array mit allen Schulen push(@schools,\%school); } # Ausgabe in eine Datei als einfaches "XML" formatiert: open(my $fh, '>', $out_file) or die("Error open $out_file ($!)\n"); print $fh "<schools>\n"; for my $school (@schools) { print $fh " <school>\n"; print $fh " <name>$school->{name}</name>\n"; print $fh " <location>$school->{location}</location>\n"; print $fh " <type>$school->{type}<type>\n"; print $fh " <address>\n"; for my $address (@{$school->{address}}) { print $fh " <entry>$address</entry>\n"; } print $fh " </address>\n"; print $fh " <description>$school->{description}</description>\n"; print $fh " </school>\n"; } print $fh "</schools>\n"; close($fh);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
use DBI; my $dbh = DBI->connect(...); my $sql_insert = q{ insert into school_tbl (location, name, type, address, description) values (?, ?, ?, ?, ?) }; my $sth = $dbh->prepare($sql_insert); # Bei jedem Durchgang dann: $sth->execute(@school{qw{location name type address description}}); $sth->finish(); $dbh->disconnect();
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
#!/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();
DBI beschrieben. Daraus ließe sich ermitteln, wo im Programmcode diese Platziert werden müssten um korrekt zu funktionieren. Möglicherweise habe ich einen zu großen Abstand zu einem Anfänger, aber ich denke der Begriff "Durchgang" sollte im Zusammenhang mit dem Programmcode, der eine große Schleife hat, die durchlaufen wird, klar sein was gemeint ist. Auch das wo sollte dabei ersichtlich sein, da man die Daten erst in die DB einfügen kann, wenn sie aus dem HTML ausgelesen wurden. Zumindest erwarte ich so etwas bei jemanden, der sagt er beherrsche SQL. Sollte dieses Verständnis nicht vorhanden sein, so Empfehle ich dringend sich dieses absolut nötige Wissen anzueignen, denn ohne das kann man kaum erwarten eine Programmiersprache zu erlernen, oder Programme zu schreiben.
865576.
865576
865588
865663
865774
Wie frage ich & perlintro
brian's Leitfaden für jedes Perl-Problem2010-10-18T10:50:26 linSorry - ich will dir nicht zu Nahe treten: Aber ich würde mir auch mal gern deinen Anfang ansehen - die ersten 10 Threads: Keine Angst - die Mühe mach ich mir nicht. Dazu ist mir die Zeit zu knapp. Bin auch nicht daran interresiert.
QuoteAls Lehrer hab ich kein Problem damit wenn jemand Fragen stellt. DU vielleicht... !?? Das trau ich dir nicht zu.
Wie frage ich & perlintro
brian's Leitfaden für jedes Perl-Problem2010-10-18T10:50:26 linhabe Real-Live-Aufgaben zu lösen.
Wie frage ich & perlintro
brian's Leitfaden für jedes Perl-Problem