Hallo,
ich möchte gerne den Inhalt einer html-Seite parsen, d.h. in meinem Fall den Inhalt zwischen den body-Tags unter Ausschluss von Inhalten wie Linkbezeichnungen, Formularinhalten etc. auslesen. Das klappt zum Teil auch ganz gut. Bei einigen Seiten jedoch erhalte ich in meinem Ausgabestring in der Variable $content nur einen Teil des Inhalts. Ein Beispiel dafür wäre Youtube.com. Hier bekomme ich die Beschreibungen der zwei ersten "featured videos" und danach ist Schluss, obwohl auf der Seite noch viel mehr steht. Hat jemand eine Ahnung woran es liegen könnte? Bei anderen Seiten dagegen bekomme ich wieder den kompletten Inhalt. Über Hilfe würde ich mich sehr freuen.
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
my $parser = HTML::Parser->new(
start_h => [ \&_starttag, 'self, tagname, text, attr' ],
end_h => [ \&_endtag, 'self, tagname' ],
text_h => [ \&_text, 'self, text, dtext' ]
);
$parser->parse($response->content());
sub _starttag {
my ($self, $tag, $attr) = @_;
$self->{'_body'} = 1 if($tag eq 'body');
$self->{'_body'} = 0 if($tag eq 'script');
$self->{'_body'} = 0 if($tag eq 'a');
$self->{'_body'} = 0 if($tag eq 'label');
$self->{'_body'} = 0 if($tag eq 'option');
$self->{'_body'} = 0 if($tag eq 'form');
}
sub _endtag {
my ($self, $tag) = @_;
$self->{'_body' } = 0 if($tag eq 'body' );
$self->{'_body' } = 1 if($tag eq 'a' );
$self->{'_body'} = 1 if($tag eq 'script');
$self->{'_body'} = 1 if($tag eq 'label');
$self->{'_body'} = 1 if($tag eq 'option');
$self->{'_body'} = 1 if($tag eq 'form');
}
sub _text {
my ($self, $dtext) = @_;
$dtext =~ s/\A\s+//;
$dtext =~ s/\s+\z//;
return() unless ( length($dtext) > 0 and $dtext =~ /[^\s]/ );
if ($self->{'_body'} == 1) {
$content=$content.$dtext." ";
}
}
User since
2003-08-07
2921
Artikel
BenutzerIn
Wird bei diesen Seiten zufällig mit AJAX oder so noch was nachgeliefert?
User since
2003-08-04
14371
Artikel
ModeratorIn
Hast Du mal geschaut, ob im Content auch das drinsteht was Du erwartest?
Hallo,
Danke für die schnellen Antworten. Anscheinend musste ich gar nicht so weit denken, denn es haben Zeilenumbrüche im Quelltext Probleme gemacht. Ich habe jetzt den Ausdruck $content =~ s/\n//g; hinzugefügt und die fehlenden Inhalte wurden dargestellt. Ansonsten fange ich auch noch Whitespaces, Kommentare und ein paar Sonderzeichen ab.. Falls jemand mehr Erfahrung hat und vielleicht noch einen Tipp hat für mögliche Fehlerquellen bzgl. HTML auslesen und wichtigen reguläre Ausdrücken, bin ich natürlich sehr dankbar. Ansonsten hoffe ich, dass nun alles wie gedacht läuft :)
User since
2008-01-24
22
Artikel
BenutzerIn
require HTML::Parse;
require HTML::FormatText;
use LWP::UserAgent;
my $ua = LWP::UserAgent->new;
my $response = $ua->get($url);
if ($response->is_success) {
$doc=$response->content;
}
$khtmldata = HTML::Parse::parse_html($doc);
$kformatter = new HTML::FormatText;
$ktextdata = $kformatter->format($khtmldata);
$ktextdata =~ s/<([^>]|\s)*>//gs;
$ktextdata =~ s/[\[\]]+//g;
$ktextdata =~ s/\*//g;;
HTH.