Leser: 19
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
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;
use HTML::TokeParser;
# my $file = 'school.html';
my @html_files = File::Find::Rule->file->name( '*.html' )->in( $html_dir );
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;
}
2010-10-02T07:33:07 biancaUnd zum Inhalt würde ich empfehlen, in $file die Datei inkl. Pfad zu definieren und $html_dir mit einem Pfad zu belegen. Beide sind in dem gezeigten Script derzeit "undefined".
QuoteIm übrigen sehe ich gerade, dass Du das Array @html_files garnicht nutzt. Wo hast Du das Script denn her? Das ist ja irgendwie nicht so ganz lauffähig, oder?
1 2 3 4 5 6 7 8 9 10 11 12 13
#!/usr/bin/perl use strict; use warnings; use diagnostics; use File::Find::Rule; my @files = File::Find::Rule->file() ->name('*.html') ->in( 'home/usr/perl/htmlfiles' ); foreach my $file(@files) { print $file, "\n"; }
1 2 3 4 5 6 7 8 9 10 11 12 13
#!/usr/bin/perl use strict; use warnings; use diagnostics; use File::Find::Rule; my @files = File::Find::Rule->file() ->name('*.html') ->in( 'home/usr/html.files' ); foreach my $file(@files) { print $file, "\n"; }
1 2 3 4 5 6 7 8 9 10 11 12 13
#!/usr/bin/perl use strict; use warnings; use diagnostics; use File::Find::Rule; my @files = File::Find::Rule->file() ->name('*.einzel') ->in( '/home/usr/htmlfiles' ); foreach my $file(@files) { print $file, "\n"; }
->name('einzelergebnis*.html')
2010-10-02T14:07:47 GwenDragonSo sollte das gehen:Code (perl): (dl )->name('einzelergebnis*.html')
1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;
use File::Find::Rule;
my @files = File::Find::Rule->file()
->name('einzelergebnis*.html')
->in( '/home/usr/perl/htmlfiles' );
foreach my $file(@files) {
print $file, "\n";
}
2010-10-02T17:41:37 GwenDragon1) Sollte ein Pfad nicht hinten einen / haben?
1
2
3
4
5
6
$ mkdir /tmp/blubb
$ touch /tmp/blubb/test.pl
$ perl -wle'use File::Find::Rule;
my @files = File::Find::Rule->file()->name("*.pl")->in("/tmp/blubb");
print @files;'
/tmp/blubb/test.pl
ls -al /home/usr/perl/htmlfiles/
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 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
#!/usr/bin/perl use strict; use warnings; use diagnostics; use File::Find::Rule; my @files = File::Find::Rule->file() ->name('einzelergebnis*.html') ->in( '/home/usr/perl/htmlfiles' ); foreach my $file(@files) { print $file, "\n"; } [/perl] zu dem Folgenden: [code=perl] #!/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"; } [/perl] und habe den folgenden output bekommen: [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 htmlfiles/einzelergebnis8e8b.html htmlfiles/einzelergebnisdcc1.html htmlfiles/einzelergebnis1dae-2.html htmlfiles/einzelergebnisa70d.html htmlfiles/einzelergebnis3cec.html htmlfiles/einzelergebnis3f1f.html htmlfiles/einzelergebnis1d2b.html htmlfiles/einzelergebnis396c.html htmlfiles/einzelergebnis2592.html htmlfiles/einzelergebnisdee0.html htmlfiles/einzelergebnis987b-2.html htmlfiles/einzelergebnise20b.html htmlfiles/einzelergebnised05.html htmlfiles/einzelergebnisdec3.html und 22 tausend weiteren Zeilen... ;-) [/quote] jetzt da die Vorübungen einiges geklärt haben muss ich daran gehen das HTML-parser-script (siehe unten) anzupassen. Also die Pfade zu defniieren: in $file the file/directory incl. und einen Pfad zu defniieren in $html_dir BTW – Bianca hat heute Morgen die Frage aufgeworfen was Array @html_files macht!!? Ist mir im Grunde auch noch nicht ganz klar!? Hier der Code des Parsers: [code=perl] #!/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; }
QuoteDer Basisordner bei OpenSuse ist nicht "/home" sondern "/"