Ich bin gerade ja dabei, meine alten Scripte mal so zu durchsuchen, ob sie alle Vista-Perl-fähig sind, und bin da auf ein altes Script gestoßen, das einen Indexer für ein Suchscript darstellt. Anders gesagt: das Script durchsucht Webseiten und filtert alle Wörter und Zahlenreihen aus Webseiten heraus und speichert sie mir in geeigneter Form ab. Wie gesagt, das Dingens ist schon uralt und verrichtet seine Dinge gut... aber nicht mit Unicode-Dateien!
Was läge also näher, als mal eben das Ganze so umzuschreiben, daß auch Unicode funktioniert... Und ich kann nur sagen: Auweia, wat ne Fummelei!
Erst hab ich's natürlich erstmal mit eigenem Wissen versucht, aber nach einiger Zeit war dann wieder surfen im Web angesagt. Und da findet man vieles, aber eben nicht so was richtig komplettes. Das Problem war eben, daß von vornherein nicht bekannt war, ob eine Datei utf8 ist oder eben nicht.
Und die meisten Scripte gehen eben davon aus, daß man vorher weiß, ob man von utf8 nach sonstwas oder von sonstwas nach utf8 konvertiert.
Die Lösung des Problemes liegt in LWP::UserAgent. Und zwar kann dieses Modul codierten Inhalt automatisch nach utf8 wandeln... allerdings auch erst dann, wenn es die Grundcodierung kennt!
Also muß man erst das charset auslesen und decoded_content zuweisen, dann gibts auch gutes utf8. Falls das charset auf UTF-8 steht oder nicht definiert ist, ist es schon utf8, zumindest auf allen möglichen Testseiten, die ich verwendet habe...
Hier nun auf jeden Fall mein "kleines" Script:
#!/usr/bin/perl print <<EOF;
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
#count words longer than 1 character grep {$woerter{$_}++ if length($_) >1} split(/\n/,$string);
# and show foreach (sort(keys %woerter)){print "$_: $woerter{$_} mal<br>\n";}
open (out,">test.txt") || die ("fehler");
#binmode(out, ":utf8"); foreach (sort(keys %woerter)){print out "$_: $woerter{$_} mal<br>\n";} close out;
#######################
#lädt eine Seite aus dem Internet
####################################
sub lade_seite{
use LWP::UserAgent;
use HTTP::Request; my ($url) = @_; print $url; my $content; my $encoding; my $request = HTTP::Request->new(GET => $url); my $ua = LWP::UserAgent->new;
$ua->agent('User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4');
################################################################
#entfernt aus einer Liste doppelte einträge
################################################################
sub del_double{ my %all=();
@all{@_}=1;
return (keys %all);
}
Testen kann man das Script hier, es lädt dann die Startseite dieses Blogs.
Nachtrag
Wie ich gerade gemerkt habe, läuft das Script wieder mal nicht auf dem Server, da dasdecoded_content anscheinend nicht bekannt ist.
Wem das genauso geht, der kann statt dessen auch den Teil in lade_seite durch den folgenden Code ersetzen, der läuft anscheinend auch auf Perl-Steinzeit-Servern...
#######################
#lädt eine Seite aus dem Internet
####################################
sub lade_seite{
use LWP::UserAgent;
use HTTP::Request;
use Encode; my ($url) = @_; print $url; my $content; my $encoding; my $request = HTTP::Request->new(GET => $url); my $ua = LWP::UserAgent->new;
$ua->agent('User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4');
So, jetzt erstmal genug damit, das war schon ziemlich hartes Brot...
Kommentare zum Beitrag "Unicode mit Perl - Einfache (?) Anwendung"
Kommentar von Renee Bäcker
Wenn ich sowas sehen, kommt mir immer sofort Web::Scraper in den Sinn. Dann braucht man sich nicht mit den ganzen regulären Ausdrücken rumzuschlagen. Das Modul nimmt viel Arbeit von einem ab.
Ein paar Beispiele:
http://reneeb-perlblog.blogspot.com/2007/09/webscraper-ein-echt-ntzliches-modul.html
http://board.perl-community.de/thread/10633/startWithMessage=10
Kommentar von Admin
Ich denke, Du beziehst das auf die Auswertung des Titles und das Entfernen des HTML's... Nun, so richtig schön finde ich das auch nicht, aber es scheint für das kurze Beispiel wohl die "vernünftigste" Lösung zu sein...
Übrigens: Natürlich hab ich auf Deiner Seite auch über Webscraper gelesen und interessant ist's schon... allerdings: ich wollte mir das dann lokal installieren (ActiveState-Perl), und da gab es das Modul gar nicht... geschweige denn auf meinem Web-Server, da herrscht noch Perl-Steinzeit...
Aber was ich da so lese über Webscraper ist schon sehr interessant!