URIs per Script auslesen?

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
azerty
Beiträge: 965
Registriert: 15.02.2007 20:18:17

URIs per Script auslesen?

Beitrag von azerty » 06.07.2008 01:19:40

Wie kann ich alle URI/URLs ("http://www.*.*) die sich in einer Text-Datei befinden, auslesen und in der Reihenfolge der Auslesung in eine andere Datei schreiben?

Hilfe ist hoechst willkommen!
.

Benutzeravatar
Sid Burn
Beiträge: 47
Registriert: 16.11.2006 15:18:02
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: /universe/earth/europe/germany/nrw/essen
Kontaktdaten:

Re: URIs per Script auslesen?

Beitrag von Sid Burn » 06.07.2008 16:27:46

Hmm,
definiere Textdatei!

Wenn es eine HTML File ist und du alle <a> Tags herausfiltern möchtest dann solltest du sowas hier nutzen.

Code: Alles auswählen

#!/usr/bin/perl
use strict;
use warnings;
use HTML::LinkExtor;

my $parser = HTML::LinkExtor->new();
$parser->parse_file($ARGV[0]);
print join "\n",
      map { my ($tag, %attr) = @$_; $attr{href} } 
      $parser->links;
Ist es irgendeine andere File kannst du sowas hier nutzen.

Code: Alles auswählen

#!/usr/bin/perl
use strict;
use warnings;
use Fatal qw(open close);
use Regexp::Common qw/URI/;

open my $fh, '<', $ARGV[0];
my $file = do { local $/ = undef; <$fh> };
close $fh;

while ( $file =~ m/$RE{URI}{HTTP}{-keep}/xmsg ) {
    print $1, "\n";
}
Programme einfach abspeichern und den Dateinamen als ersten Parameter übergeben.

Beide Programme liefern dir aber unterschiedliche Ergebnisse!

Das erste Parsed eine HTML Datei durch such alle <a> Tags und gibt dir dann den Inhalt des href Attributes zurück. Diese müssen nicht unbedingt mit http:// etc. anfangen sondern es kann halt alles mögliche sein was man halt so verlinken kann.

Das zweite sucht anhand einer Regex nach den Links. Hier werden nur http:// Links gefunden.

Für das erste musst du HTML::LinkExtor installieren für das zweite Regexp::Common::URI.

Unter Debian müsste HTML::LinkExtor im Packet zu HTML::Parser enthalten sein. Dieses wiederrum müsste wiedderum im Packet "libwww-perl" enthalten sein. Bin mir gerade nicht sicher, da ich nicht unter Debian bin und die beispiele unter Windows in ner cygwin Box geschrieben habe. Regexp::Common::URI musst du evtl. zusätzlich zu "Regexp::Common" (libregexp-common-perl) installieren. Hier weiß ich gerade auch nicht ob es in nem Debian Modul vorhanden ist. Notfalls halt Manuell installieren. (cpan Regexp::Common::URI)

Benutzeravatar
Meillo
Moderator
Beiträge: 9254
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: URIs per Script auslesen?

Beitrag von Meillo » 08.07.2008 15:19:22

Verwende `grep'!
Dieses bietet die Option '-o' (only), bei der nur der Treffer ausgegeben wird. (Weiß nicht ob alle `grep' dies Option haben.)

Für eine gute RegExp habe ich mich einfach mal bei `urlview' bedient: siehe `man urlview', da steht sie drin.

Code: Alles auswählen

(((http|https|ftp|gopher)|mailto):(//)?[^ <>"\t]*|(www|ftp)[0-9]?\.[-a-z0-9.]+)[^ .,;\t\n\r<">\):]?[^, <>"\t]*[^ .,;\t\n\r<">\):]
Das Ergebnis ist somit:

Code: Alles auswählen

egrep -o '(((http|https|ftp|gopher)|mailto):(//)?[^ <>"\t]*|(www|ftp)[0-9]?\.[-a-z0-9.]+)[^ .,;\t\n\r<">\):]?[^, <>"\t]*[^ .,;\t\n\r<">\):]' textfile
Achtung:
`grep' kann wohl keine '\t' (wie ich überrascht festgestellt habe), diese müssen durch richtige Tabs ersetzt werden.
Also: '\t' löschen, dann STRG+v und dann TAB. Somit wird ein richtiger Tab-Character eingefügt. Das muss man für jedes '\t' in obiger Zeile machen.
Dann funktioniert es.
Use ed once in a while!

Antworten