First-time perl user Probleme mit UTF8

29/01/2009 - 17:34 von N.E.1 | Report spam
Hallo,

ich muss für ein Weiterbildungsprojekt ein Script schreiben, das Links
aus einer HTML-Datei extrahiert und dann die einzelnen Hosts resolvet.
Ich habe mir wirklich die Finger wundgegooglet und es mit bestem
Wissen zusammengestellt.

Das vorlàufige Ergebnis sieht so aus:

#!/usr/bin/perl
use warnings;
use strict;
use HTML::SimpleLinkExtor;
use Socket;
use utf8;


my $file;
my $filename;
my $url;
my @links;
my $link;
my $packed_ip;
my $ip_address;

$file = new HTML::SimpleLinkExtor();

# Extracts Links from a HTML File
# Written by Vaibhav Gupta guptav@cse.iitb.ac.in
$filename = $ARGV[0];
$url = $ARGV[1]; #base url else empty string

if($filename eq "" ) {
print "Usages: ./extractlink.pl filename.html";
exit ;
}

$file->parse_file($filename);
@links= $file->a;
foreach $link (@links){
chomp $link;
$packed_ip = gethostbyname($link);
if (defined $packed_ip) {
$ip_address_utf8 = inet_ntoa($packed_ip);
$ip_address=utf8::decode($ip_address_utf8);
print "$ip_address";
}

}

Ergebnis davon ist: Parsing of undecoded UTF-8 will give garbage when
decoding entities at /usr/lib/perl/Parser.pm line 102

Ich denke auch mal, dass gethostbyname ein Problem hat aus dem Link
was zu resolven, weil wohl nicht nur der Host allein drinsteht.

Könnt ihr mir bitte weiterhelfen? Ich hab zwar einiges gelernt in der
kurzen Zeit, aber noch viel zu wenig um alles nachvollziehen zu
können. Wàre sehr schön.

Markus Keller
 

Lesen sie die antworten

#1 Christian Kirsch
30/01/2009 - 10:10 | Warnen spam
N.E.1 schrieb:
Hallo,

ich muss für ein Weiterbildungsprojekt ein Script schreiben, das Links
aus einer HTML-Datei extrahiert und dann die einzelnen Hosts resolvet.
Ich habe mir wirklich die Finger wundgegooglet und es mit bestem
Wissen zusammengestellt.

Das vorlàufige Ergebnis sieht so aus:

#!/usr/bin/perl
use warnings;
use strict;
use HTML::SimpleLinkExtor;
use Socket;
use utf8;



Wo siehst Du denn da UTF8-Bedarf?



my $file;
my $filename;
my $url;
my @links;
my $link;
my $packed_ip;
my $ip_address;

$file = new HTML::SimpleLinkExtor();

# Extracts Links from a HTML File
# Written by Vaibhav Gupta
$filename = $ARGV[0];
$url = $ARGV[1]; #base url else empty string

if($filename eq "" ) {
print "Usages: ./extractlink.pl filename.html";
exit ;



Perl-typischer wàre statt "print ... exit" vermutlich ein "die ..."

}

$file->parse_file($filename);
@links= $file->a;
foreach $link (@links){
chomp $link;



Bist Du sicher, dass chomp an diser Stelle nötig ist und auch das tut,
was Du gerne hàttest?

$packed_ip = gethostbyname($link);



Hier hast Du also eine IP-Adresse.

if (defined $packed_ip) {
$ip_address_utf8 = inet_ntoa($packed_ip);
$ip_address=utf8::decode($ip_address_utf8);



Mir ist nicht ganz klar, wo Du hier UTF8 siehst. Hier (Mac) sagt die
Dokumentation zu inet_ntoa:

The routine inet_ntoa() takes an Internet address and returns an ASCII
string representing the address in `.' notation.

Mit anderen Worten: Aus dem 32-Bit Integer macht die Funktion eine
menschenlesbare Darstellung in der Form aaa.bbb.ccc.ddd. Da a, b, c und
d nur Ziffern sind (also ASCII) kommt an dieser Stelle nirgendwo UTF8
ins Spiel.

print "$ip_address";
}

}

Ergebnis davon ist: Parsing of undecoded UTF-8 will give garbage when
decoding entities at /usr/lib/perl/Parser.pm line 102

Ich denke auch mal, dass gethostbyname ein Problem hat aus dem Link
was zu resolven, weil wohl nicht nur der Host allein drinsteht.



Mag sein. Dann wàre es vermutlich sinnvoll, aus dem Link eben nur den
Hostnamen zu extrahieren.

$link =~ {http://([^/]+)/}i;
$hostname = $1;

könnte für HTTP-Links funktionieren (ich habe es nicht getestet!). Das
extrahiert aus dem Link alles nach "http://" bis vor den nàchsten "/".
Für FTP etc. musst Du àhnliches bauen.

Übrigens gibt es auch einen Perl-Debugger. Mit
perl -d script
kannst Du damit Dein Script kontrolliert ablaufen lassen.

Ähnliche fragen