|
|
 |

|

 |

| Community » Perl: Allgemeines Forum |
|
HTML::LinkExtor geht immer nur einmal - wieso?
|
Seitenanfang |
| hallo ich habe ein großes problem, ich möchte den HTML::LinkExtor mehrmals benutzen, leider funktioniert das immer nur einmal. bei dem 2. aufruf geht er dann nicht mehr. ich habe schon alles probiert. desshalb bin ich hier. get_links_ebene2 ist meine funktion die mehrmals aufgerufen wird. $url ist der aktuelle pfad $baseurl ist die hauptpfad, bzw. die einschränkung. use LWP::UserAgent; use HTML::LinkExtor; use URI::URL;sub get_links_ebene2 { my ($url,$baseurl) = @_; print "<p><b>Debug:</b><br> URL: $url <br> BaseURL: $baseurl </p>"; $agent = LWP::UserAgent->new; $agent->timeout(20); $agent->agent(set_user_agent()); #USER AGENT # Set up a callback that collect image links my @imgs = (); sub callback { my($tag, %attr) = @_; return if $tag ne 'a'; # we only look closer at <img ...> push(@imgs, values %attr); } # Make the parser. Unfortunately, we don't know the base yet # (it might be diffent from $url) $p = HTML::LinkExtor->new(\&callback); # Request document and parse it as it arrives $res = $agent->request(HTTP::Request->new(GET => $url), sub {$p->parse($_[0])}); # Expand all image URLs to absolute ones my $base = $res->base; @imgs = map { $_ = url($_, $base)->abs; } @imgs; #interne Links herausfiltern my (@interne_links); my $templink; my $incrementor=0; foreach $templink (@imgs) { if( $templink =~ m/$baseurl/ ) #wenn 'not' davor werden externe links angezeigt. { # nur links mit einer max länge von 255 zeichen aufnehmen $interne_links[$incrementor]=$templink; print "<br>$templink"; $incrementor++; } } print "<b><br>index: $incrementor<br>"; return @interne_links; }
vielleicht hat ja jemand ideen oder alternativen.
Datum: 06.08.2007-09:44

|
re: HTML::LinkExtor geht immer nur einmal - wieso?
|
Seitenanfang |
| Hallo! <Moralpredigt>Hättest du use strict; use warnings;
aktiviert, hätte dir perl einen Hinweis gegeben, dass da was nicht stimmt.</Moralpredigt>Ich kann dir leider nicht sagen, was nun genau der Fehler war, aber ich hab ihn entfernen können. Offenbar gab es einen Konflikt im Zugriff auf @imgs. Zuerst also mal strict und warnings aktivieren, und die fehlenden 'my's vor den Erstaufruf diverser Variablen setzen. Danach folgende Korrektur durchführen:
sub callback { my($img, $tag, %attr) = @_; return if $tag ne 'a'; # we only look closer at _a_ <-- Befehl angepasst, ohne den Kommentar zu ändern... push(@$img, values %attr); } my @imgs = (); my $p = HTML::LinkExtor->new( sub { callback(\@imgs, @_) } ); Damit wird der callback-subroutine ein Zeiger auf das @imgs-array übergeben. Somit muss perl nicht mehr nach dem richtigen Array suchen, wobei er sich wohl irgendwie verhaspelt hatte.Hoffe, so geht es auch bei dir jetzt... Grüße, Skrilax
Datum: 06.08.2007-11:26

|
re: HTML::LinkExtor geht immer nur einmal - wieso?
|
Seitenanfang |
| Cool danke für die schnelle Antwort! Werde ich gleich mal probieren.
Datum: 06.08.2007-11:38

|
Es funktioniert!
|
Seitenanfang |
use strict; use warnings;hab ich mir eintätowieren lassen danke
Datum: 06.08.2007-12:10

|
|

|

|

|
 |

|

|
|