Thread I/O Operations: Pfade übertragen auf einen HTML-Parser (17 answers)
Opened by lin at 2010-10-03 13:29

lin
 2010-10-03 13:29
#141660 #141660
User since
2010-09-26
35 Artikel
BenutzerIn
[default_avatar]
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
htmlfiles/einzelergebnis80b5.html
htmlfiles/einzelergebnisa0ef.html
htmlfiles/einzelergebnis1b42.html
htmlfiles/einzelergebnis5960.html
htmlfiles/einzelergebnise523.html
htmlfiles/einzelergebnis2c7e.html
htmlfiles/einzelergebnisdf57.html
htmlfiles/einzelergebnis2b53-2.html
htmlfiles/einzelergebnisb1c0-2.html
....und 22 Tausend weitere Zeilen ... ;-)



- 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 ;-)

View full thread I/O Operations: Pfade übertragen auf einen HTML-Parser