Leser: 30
1
2
3
4
my $file = 'school.html';
my $p = HTML::TokeParser->new($file) or die "Can't open: $!";
my %school;
2010-09-27T18:31:29 linWill HTML-files Parsen - meine Frage ist - wo ist denn der Speicherort genau - ich mein wo muss ich denn den Ordner mit den zu parsenden Files ablegen?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# strict und warnings sollten bei jedem Programm Pflicht sein
use strict;
use warnings;
# Bibliothek zum einfachen Finden von Dateien
# muss ggf. noch installiert werden
use File::Find::Rule;
# Bibliothek zum Parsen von HTML-Dateien
use HTML::TreeBuilder::LibXML;
# Verzeichnis in dem die HTML-Dateien gespeichert sind
my $html_dir = '/path/to/dir/with/html.files';
# hole alle .html-Dateien aus dem Verzeichnis
my @html_files = File::Find::Rule->file->name( '*.html' )->in( $html_dir );
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;
}
Quote
my $html_dir="C:\htmlperl";
my $output="C:\htmlperl\output.txt";
my $file = $ARGV[0];
Use File::Spec; File::Spec->rel2abs( __FILE__ );
1 2 3 4 5 6 7 8 9
#!/usr/bin/perl use strict; use warnings; use Cwd; use FindBin qw($Bin); print "Aktuelles Arbeitsverzeichnis: ".getcwd()."\n"; print "Vollständiger Scriptpfad: $Bin \n";
1
2
Aktuelles Arbeitsverzeichnis: /home/lin/Desktop
Vollständiger Scriptpfad: /home/lin/Desktop
1 2 3 4 5 6 7 8 9 10 11
#!/usr/bin/perl use strict; use warnings; my $filename='./test.txt'; open(my $fh, '<', $filename) || die("ERROR open $filename ($!)\n"); while(my $line=<$fh>) { print $line; } close($fh);
1 2 3
lin@linux:~/perl_tests$ ./read_print.pl Das ist nur ein Test. Diese Datei hat zwei Zeilen!
1
2
lin@linux:~$ /home/lin/perl_tests/read_print.pl
ERROR open ./test.txt (Datei oder Verzeichnis nicht gefunden)
1 2 3 4 5 6 7 8 9 10 11 12 13 14
#!/usr/bin/perl use strict; use warnings; use FindBin qw($Bin); my $filename='./test.txt'; my $real_filename="$Bin/$filename"; open(my $fh, '<', $real_filename) || die("ERROR open $real_filename ($!)\n"); while(my $line=<$fh>) { print $line; } close($fh);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/perl
use strict;
use warnings;
use HTML::TokeParser;
if ($#ARGV < 0) {
print "Usage: 'schoolhtmlparser.pl file'\n";
exit(1);
}
my $file = $ARGV[0];
my $p = HTML::TokeParser->new($file) or die "Can't open: $!";
....
1 2 3 4 5 6 7 8 9 10 11
#!/usr/bin/perl use strict; use warnings; use HTML::TokeParser; my $file = shift(@ARGV) or die "Usage: '$0 <filename>'\n"; my $p = HTML::TokeParser->new($file) or die "Can't open: '$ile' ($!)\n"; ...
2010-09-29T10:45:15 linDas mit dem Dateinnamen der zu parsenden DATEI so zu übergeben find ich auch sehr interessant: "Usage: '$0 <filename>'\n";
my $file = shift(@ARGV) or die "Usage: '$0 <filename>'\n"
2010-09-29T10:45:15 linFrage - ich muss dann noch die DATEI die geschrieben werden soll nennen - und der einen Pfad zuordnen. Wie mache ich das denn!? Und wie mit dem zu erzeugenden File. Ich denk ich brauchs einfach - am Anfang.
2010-09-29T10:45:15 linIch könnte es ja auch so machen dass ich das Script selbst nach /usr/bin lege und nicht die Input-, sowie Outputfiles.
2010-09-29T10:45:15 linAber grundsätzlich würde das ja gehen. Ich meine als Anfänger - dass ich das übersichtlich halte. Auf die Portabilität brauch ich hier nicht so viel zu achten. Es - das Script muss erstmal bei mir seinen Dienst tun.
Dann kann ich ja weitersehen. Wenn es erstmal gelaufen ist - dann kann ich das immer noch portieren.
2010-09-29T10:45:15 linWenn es "portable" sein soll, kann ich grundsätzlich einfache Options fuer das Script verwenden, die man beim Start angibt, z.B. "script.pl --inputfiles /pfad/zu/den/inputfiles --output /pfad/zum/outputdir".
2010-09-29T13:48:53 topegNicht dass ein Missverständniss aufkommt. Diese Zeile:Code (perl): (dl )my $file = shift(@ARGV) or die "Usage: '$0 <filename>'\n"
macht folgendes:
Definiere eine Variable "$file", hole aus "@ARGV" das erste Argument. Wenn das Ergebnis dieser Aktion "Falsch" (in diesem Fall 'undef' oder '0') sein sollte so führe die "Usage: '$0 <filename>'\n" aus. "die" Lässt das Programm mit einer Fehlermelung ("Usage: '$0 <filename>'\n") sterben. Der "Zauber" ist hier das "or". Das logische 'oder' verhält sich in perl so, dass der zweite Teil nur ausgeführt wird wenn der erste teil ein 'falsch' zurück gibt ist der Teil aber 'wahr', so ist bei einem logischen 'oder' egal ob der zweite Teil 'wahr' oder 'falsch' ist, die Gesammtaussage ist immer wahr. Ich hoffe das war jetzt nicht zu verwirrend.
QuoteKeine Eindeutige Formulierung. Ich kann jetzt nicht genau sagen was du wissen willst.
Willst du wissen wie man eine Datei schreibend öffnet, oder wie man ein Datei allgemein öffnet, oder wie man eine Datei zum Dateinamen findet, oder wie man aus einer Pfadangabe eine absolute Pfadangabe macht, oder wie man eine Pfadangabe als solchen erkennt? Bitte spezefiziere dein Problem am besten mit einem Codebeispiel.
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;
}
2010-09-30T06:22:31 neposWenns nur ein Skript ist, das du benutzt, dann würde ich es in deinem Home-Directory nach ~/bin/ legen.
QuoteWas genau ist denn nun dein Problem mit den Pfaden/Dateien/Directories?
1
2
3
4
5
# Verzeichnis in dem die HTML-Dateien gespeichert sind
my $html_dir = '/path/to/dir/with/html.files';
# hole alle .html-Dateien aus dem Verzeichnis
my @html_files = File::Find::Rule->file->name( '*.html' )->in( $html_dir );
2010-09-30T08:04:41 linCode: (dl )1
2
3
4
5# Verzeichnis in dem die HTML-Dateien gespeichert sind
my $html_dir = '/path/to/dir/with/html.files';
# hole alle .html-Dateien aus dem Verzeichnis
my @html_files = File::Find::Rule->file->name( '*.html' )->in( $html_dir );
my @html_files = File::Find::Rule->file->name( '*.html' )->maxdepth( 1 )->in( $html_dir );
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;
}