perlunity.de - PERL | JAVASCRIPT | PHP | MySQL | APACHE



#!/COMMUNITY

Members: 5374
davon online: 1
weitere User: 19
Click for quality!




12.02.2012 / 03:44

Community-Member werden   |   Paßwort vergessen   |   OnlineMonitor (1) Wer ist online ... OnlineMonitor starten !
     

 

Home


PERLscripts


PHPscripts


JAVAscripts


Hilfreiches


Links2www


Newscenter


Community


Interna




Community  »  Perl: Allgemeines Forum zur Themenübersicht Themensuche Themenansicht in Thread-Modus


BeitragHTML::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

Beitragre: 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

Beitragre: 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

BeitragEs funktioniert!
Seitenanfang
use strict;
use warnings;

hab ich mir eintätowieren lassen

danke

Datum: 06.08.2007-12:10

-






-
-