Thread I/O Operations: Pfade übertragen auf einen HTML-Parser
(17 answers)
Opened by lin at 2010-10-03 13:29
Hallo Community, guten Tag!
also durch die Vorübungen bin ich jetzt dann doch weitergekommen. Da ich Starter war - neu bei Linux auf OpenSuse 11.3 und gleichermaßen neu auch bei Perl war das bisher einiges an Neuem: Jetzt habe ich aber einen Startpunkt - denn ich kenn die Pfade jetzt einigermaßen: Der Code des HTML-Parsers (siehe unten), der noch pfadmäßig angepasst werden muss. a. auf den Pfad zu dem Directory, das die zu parsenden Files enthält b. auf den Pfad zu der zu erzeugenden Datei - mit den Ergebnissen des Parserjobs Mich hat einer darauf hingewiesen dass ich aufpasen soll - nicht alles als root machen. Ich hab einige Übungen auf (/unter) Root gemacht. Jetzt ists mir wichtig mal einen proof of concept zu kriegen - herauszukriegen ob der Parser auch läuft!? Den Code hier sollte ich also anpassen: Code (perl): (dl
)
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 #!/usr/bin/perl use strict; use warnings; use HTML::TokeParser; my $file = 'school.html'; my $p = HTML::TokeParser->new($file) or die "Can't open: $!"; my %school; 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'); } } print qq/$school{'name'}\n/; print qq/$school{'location'}\n/; print qq/$school{'type'}\n/; foreach (@{$school{'address'}}) { print "$_\n"; } print qq/\nDescription: $school{'description'}\n/; sub clean_address { my $text = shift; my @lines = split "\n", $text; foreach (@lines) { s/^\s+//; s/\s+$//; } return \@lines; } BTW: einige Fragen an den Code : was macht das Array @html_files? > my @html_files = File::Find::Rule->file->name( '*.html.files' )->in( $ > +html_dir ); Was macht das plus Zeichen hier? Was mach ich mit der variable $htmo_dir. Das arbeitet wenn $html_dir einen Pfad hat (absolut oder relative) der Top-Level directory um die HTML files zu suchen. >print qq/$school{'name'}n/; Sollte hier nicht stehen: \n anstat nur n: Parenthese würde das wohl verhindern, dass das qq argument wie eine regular expression aussieht. Was ich gestern - mit euch hier - herausgefunden habe: b. die Pfade -.herausgefunden mit einem kürzeren Script, das ich mal perl_script_two.pl genannt habe und das in Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 /usr/perl drinneliegt: #!/usr/bin/perl use strict; use warnings; use diagnostics; use File::Find::Rule; my @files = File::Find::Rule->file() ->name('einzelergebnis*.html') ->in( '.' ); foreach my $file(@files) { print $file, "\n"; } Das hat den folgenden Output zur Folge: Quote - jetzt sollte also das o.g. script angepasst werden, damit ich mal überhaupt sehe ob das geht!? Wenn ich noch mehr erklären soll - dann einfach kurz Bescheid sagen. Freu mich auf tipps. euer Lin ;-) |