URI::Find - Extraktion von URIs aus beliebigen Texten

Veröffentlicht von Thomas Fahle am (Permalink)

URI::Find von Michael G Schwern vereinfacht das Extrahieren von URIs aus beliebigen Texten.

 

Beispiel URI Extraktion

Das Beispielprogramm holt eine Webseite und gibt den HTML-Quelltext an die Methode find. Die Methode find ruft bei jedem gefundenem URI die callback-Funktion callback mit zwei Parametern auf: Einem Objekt der Klasse URI::URL und dem gefundenem URI. Der Rückgabewert der callback-Funktion wird genutzt, um die gefundene URI im Text (hier in $html) zu ersetzen.

#!/usr/bin/perl
use strict;
use warnings;

use URI::Find;
use LWP::Simple;

my $url = 'https://perl-howto.github.io';

my $html = get $url;

# Container fuer URIs
my %uris = ();

my $finder = URI::Find->new( \&callback );

my $found = $finder->find( \$html );

# URIs absteigend sortiert ausgeben
my @uris = reverse sort keys %uris;

foreach my $uri (@uris) {
    print "$uri\n";
}
exit();

sub callback {
    my ( $uri_url, $uri ) = @_;

    # $uri_url ist ein Objekt der Klasse URI::URL

    # Doppelte URIs entfernen
    $uris{$uri}++;

    # Der Ruckgabewert ersetzt die URI in \$html
    return "--- Ersetzt durch XXXXX ---";
}

Das Programm erzeugt folgende Ausgabe:

https://www.socialtext.net/perl5/index.cgi?events_2010_froscon
http://www.zeit.de/digital/datenschutz/2010-09/twitter-oauthcalypse-authentification
http://www.yahoo.de
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd
http://www.w3.org/1999/xhtml
http://www.thomas-fahle.de/perl-training/index.html
http://www.thomas-fahle.de/perl-programmierung/index.html
http://www.thomas-fahle.de/2010/08/kurzbericht-perlfroscon-2010-st-augustin-21-und-22-august-2010.html
http://www.thomas-fahle.de
http://www.slideshare.net/thomasfahle/dancer-5032076
http://www.slideshare.net/reneebperl/fr-os-con2010develnytprof
http://www.slideshare.net/reneebperl/fr-os-con2010bmatrainer
......

URI::Find nimmt es bei Erkennung der URI mit dem Schema sehr genau - eine etwas laxere Erkennung bietet URI::Find::Schemeless.

 

Kommandozeile: urifind

URI::Find bietet auch ein Kommandozeilen Tool, urifind, welches Dateien nach URIs durchsucht.

 $ urifind file

In bester *NIX-Manier lässt sich urifind auch als Filter verwenden:

$ wget https://perl-howto.github.io -O - | urifind -u -s -r
erzeugt die selbe Ausgabe wie das oben gezeigte Beispiel.

Weitere Optionen liefert urifind -h.

 

Siehe auch

Weitere Posts