www.farid-hajji.net banner

Farid Hajji

Perl: Einführung, Anwendungen, Referenz (2/e) [Support-Site]

Farid Hajji: Perl - Einführung, Anwendungen, Referenz
2., aktualisierte und erweiterte Auflage
Addison-Wesley Longman, ISBN 3-8273-1535-2

Ergänzung

html-parse-links3.pl
#!/usr/local/bin/perl -w
# html-parse-links3.pl -- Links aus einer HTML-URL extrahieren
#                   mit HTML::LinkExtor und Callback-Funktion.
#                   Basis-Anpassung mit dem URI::URL-Modul.
#                   URL-Download mit LWP::UserAgent.

use LWP::UserAgent;            # Zum Download der URL
use HTML::LinkExtor;           # Der Link-Extraktor
use URI::URL;                  # Relative in absolute Links konvertieren.

my $url = shift();             # Die zu holende URL aus der Kommandozeile

my $p = HTML::LinkExtor->new(\&callback);  # Parser erzeugen.

# URL anfordern und gleichzeitig mit $p parsen:
my $ua  = new LWP::UserAgent;
my $res = $ua->request(HTTP::Request->new(GET => $url),
                       sub { $p->parse(shift()) });
unless ($res->is_success()) {
    die $res->error_as_HTML();
}

# Alle Links absolut machen:
my $base = $res->base();  # Die Basis liefert uns HTTP::Response
my @abs_alinks = map { $_ = url($_, $base)->abs() } @alinks;
my @abs_pics   = map { $_ = url($_, $base)->abs() } @pics;
my @abs_others = map { $_ = url($_, $base)->abs() } @others;

print "<a>-Links  :\n", join("\n", @abs_alinks), "\n";
print "<img>-Links:\n", join("\n", @abs_pics),   "\n";
print "Other Links:\n", join("\n", @abs_others), "\n";

# Diese Callback-Funktion callback() wird jedesmal aufgerufen,
# wenn die HTML::LinkExtor()-Instanz $p einen Link-Tag gefunden hat.
# Bei <tagname attr1=url1 attr2=url2>
# wird in @_ uebergeben: (tagname, attr1 => url1, attr2 => url2)
# Beachte, dass bei Bedarf tagname und attr1, attr2 in Kleinbuchstaben
# konvertiert werden, bevor callback() aufgerufen wird!
sub callback {
    my ($tag, %links) = @_;

    # Je nach Typ der Links unterschiedlich reagieren:
    if ($tag eq 'a') {
    # Ein <a>-Link:
    push(@alinks, values %links);
    } elsif ($tag eq 'img') {
    # Ein <img>-Link:
    push(@pics, values %links);
    } else {
    # Ein anderer Typ von Links:
    push(@others, values %links);
    }
}
   

[Prev] [Up] [Relevant Chapter] [Next]

[Alte Quelle]


Last modified: $Date: 2006/05/18 12:55:48 $
FH. Search :: Sitemap :: Disclaimer :: Copyright :: Privacy
FreeBSD Logo