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!
URIs per Script auslesen?
- 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?
Hmm,
definiere Textdatei!
Wenn es eine HTML File ist und du alle <a> Tags herausfiltern möchtest dann solltest du sowas hier nutzen.
Ist es irgendeine andere File kannst du sowas hier nutzen.
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)
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;
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";
}
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)
Re: URIs per Script auslesen?
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.
Das Ergebnis ist somit:
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.
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<">\):]
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
`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!