Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]10820[/thread]

HTML Parser - Inhalte nicht immer vollständig



<< >> 5 Einträge, 1 Seite
Gast Gast
 2007-11-18 21:51
#102541 #102541
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.

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
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." ";
}
}
pktm
 2007-11-19 00:40
#102548 #102548
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Wird bei diesen Seiten zufällig mit AJAX oder so noch was nachgeliefert?
http://www.intergastro-service.de (mein erstes CMS :) )
renee
 2007-11-19 09:49
#102552 #102552
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Hast Du mal geschaut, ob im Content auch das drinsteht was Du erwartest?
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Gast Gast
 2007-11-19 15:21
#102576 #102576
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 :)
YippyYappo
 2008-01-24 17:52
#105126 #105126
User since
2008-01-24
22 Artikel
BenutzerIn
[default_avatar]
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.
<< >> 5 Einträge, 1 Seite



View all threads created 2007-11-18 21:51.