problem mit auslesen des query-string nach "?"
Manuel Massoth
- perl
Guten Morgen,
und zwar habe ich eine url in einer text datenbank. von dieser url will ich ein query-string auslesen. das funktioniert auch soweit, jedoch nicht bei dem ersten string der direkt hinter dem "?" kommt. das ausgelesen funktioniert nur nach dem ersten "&".
?q=keyword& # wird nicht ausgelesen
&q=keyword& # wird ausgelesen
$Dateiname = "search?q=keyword1 keyword2&ie=UTF-8&oe=UTF-8&hl=de&btnG=Google Suche&meta="
@wertepaare = split(/&/, $Dateiname);
foreach $wertepaar (@wertepaare)
{
($name, $value) = split(/=/, $wertepaar);
$name =~ tr/+/ /;
$name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/|/%7C/g;
$value =~ s/~!/ ~!/g;
if ("$name" eq "q") {
open (LOG, >>keywords.dat");
print LOG "$value\n";
close (LOG);
}
}
wenn mir jemand sagen könnte wo der wurm drin steckt,
wäre ich sehr dankbar.
Gruß
Manuel
Halihallo Manuel
[...]
use CGI;
perldoc CGI
Viele Grüsse
Philipp
Hi,
$Dateiname = "search?q=keyword1 keyword2&ie=UTF-8&oe=UTF-8&hl=de&btnG=Google Suche&meta="
@wertepaare = split(/&/, $Dateiname);
Die Listenelemente sind jetzt:
search?q=keyword1 keyword2
ie=UTF-8
oe=UTF-8
hl=de
btnG=Google Suche
meta=
Du mußt also zuerst alles bis zum ? (einschließlich) wegwerfen.
if ("$name" eq "q") {
Der Wert "q" taucht für Name nicht auf, s.o.
cu,
Andreas
Hallo Manuel,
$Dateiname = "search?q=keyword1 keyword2&ie=UTF-8&oe=UTF-8&hl=de&btnG=Google Suche&meta="
@wertepaare = split(/&/, $Dateiname);
ich habe zwar von Perl keine Ahnung, würde aber mal vermuten, dass das nicht funktioniert, weil der erste Parameter einen regulären Ausdruck erwartet und das '?' im Gegensatz zum '&' darin eine besondere Bedeutung hat. Versuch es doch mal das ? mit einem \ zu maskieren (also ...split(/?/,$Dateiname);).
Grüße aus Nürnberg
Tobias
Guten Morgen,
und zwar habe ich eine url in einer text datenbank. von dieser url will ich ein query-string auslesen. das funktioniert auch soweit, jedoch nicht bei dem ersten string der direkt hinter dem "?" kommt. das ausgelesen funktioniert nur nach dem ersten "&".
?q=keyword& # wird nicht ausgelesen
&q=keyword& # wird ausgelesenBespiel:
$Dateiname = "search?q=keyword1 keyword2&ie=UTF-8&oe=UTF-8&hl=de&btnG=Google Suche&meta="
use CGI qw/:standard/;
my $q = param('q');
my $ie = param('ie');
Darüberhinaus musst du die URL codieren. sie soll (darf?) z.b. keine Leerzeichen enthalten. Auch dafür bietet das Modul eine Funktion an.
Struppi.
Hi,
oh man, hier sind wieder ein paar "use CGI"-Junkies unterwegs, die deinen folgenden Text nicht gelesen haben :)
und zwar habe ich eine url in einer text datenbank. von dieser url will ich ein query-string auslesen. das funktioniert auch soweit, jedoch nicht bei dem ersten string der direkt hinter dem "?" kommt. das ausgelesen funktioniert nur nach dem ersten "&".
?q=keyword& # wird nicht ausgelesen
&q=keyword& # wird ausgelesenBespiel:
$Dateiname = "search?q=keyword1 keyword2&ie=UTF-8&oe=UTF-8&hl=de&btnG=Google Suche&meta="
Dumme Zwischenfrage: Welches Programm speichert denn diese URLs ab?
Sollte man nicht schon da ansetzen?
Wie auch immer...
Du hast also einfach einen String der Form:
URI?parameter
Wobei parameter durch & getrennt werden.
Ausserdem scheint es ggf. zu Fehlern beim Abspeichern zu kommen, wo naemlich im dem ehemaligen Querystring Leerzeichen eingebuttert wurden :(
Ob du diese Leerzeichen korrigierst, indem du diese durch ein "+" ersetzt, ist abhängig davon, was du später mit den daten machen willst..
Also machen wir es einfach:
my ($uri, $params) = split(/?/,$Dateiname);
if (not $params) {
# Keine Parameter da :)
} else {
@wertepaare = split(/&/,$params);
}
Dann weiter wie bisher:
open (LOG, >>keywords.dat");
foreach $wertepaar (@wertepaare)
{($name, $value) = split(/=/, $wertepaar);
Brauchen wir ggf. nicht.
Wie gesagt: Was willst du mit den Daten anfangen?
$name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
Siehe oben
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/|/%7C/g;
$value =~ s/~!/ ~!/g;
ich vermute eher du wolltest dies tun:
print LOG "$value\n" if ($value);
}
close LOG;
Ciao,
Wolfgang
Halihallo xwolf
oh man, hier sind wieder ein paar "use CGI"-Junkies unterwegs, die deinen folgenden Text nicht gelesen haben :)
---
my $query_string = ...;
my ($uri,$params) = split(/?/,$query_string,2);
$query = new CGI($params);
---
dass es anders geht, natürlich TIMTOWTDI; aber warum das Rad von neuem Erfinden? - Es
sei denn, die Anwendung ist zeitkritisch und selbst dann wäre es wesentlich performanter,
wenn man den Algorithmus per se verbessert indem man den Querystring gegen eine RegExp
matched und die Keywords gleich ausfiltert; das wäre wesentlich performanter.
Äm, also was war dein Argument gegen die "use CGI"-Junkies?
Viele Grüsse
Philipp
Hi
Äm, also was war dein Argument gegen die "use CGI"-Junkies?
Da er nur einen klitzekleinen Fehler und ansonsten den Code schon hatte, ist es nicht notwendig was neues, nämlich das ansonsten offenbar nicht benötigte CGI-Modul, zu verwenden und alles was er bisher getan hat, Kommentarlos wegzuwerfen.
IMHO sollte es darum gehen, den Fehler zu finden.
Und nicht, diesen einfach zu ignorieren, indem man darauf verweist, wie es im Falle von CGI-Skripten auch geht. (Und dabei auch noch -trotz AUTOLOAD- Byteverschwendung zu betreiben)
Würde ich jedenfalls an irgendeinen Code ne zeitlang rumhängen und
es nur an einer Kleinigkeiten hängen, würde ich mich auch eher darüber freuen, wenn mir jemand den Fehler löst...und nicht einfach indirekt sagt: "vergiss es, mach es ganz anders"
Eine der Hauptphilosophien von Perl ist und sollte doch bleiben:
Was du nicht weisst (und nicht nutzt), tut dir nicht weh.
Ciao,
Wolfgang
Halihallo Wolfgang
[...]
ACK. Das "Full" lasse ich weg weil es nur die eine Hälfte ist. Die Andere ist das
"darauf aufmerksam machen", dass es andere Lösungswege gibt und diese u.U. sinnvoller
und einfacher sind. Zur anderen Hälfte habe ich im zweiten Posting beigetragen:
Mit einer geschickten Regular Expression liesse sich das Extrahieren von Keywords
wesentlich performanter und speicherschonender realisieren. Zumindest behaupte ich dies
einmal, ohne Benchmarks durchgeführt zu haben.
Viele Grüsse
Philipp
Hallo xwolf,
Vielen Dank für deine Antwort - hat mir sehr geholfen!
my ($uri, $params) = split(/?/,$Dateiname);
if (not $params) {
# Keine Parameter da :)
} else {
@wertepaare = split(/&/,$params);
}
if ("$name" eq "q") {
http://www.counterserver.de/index.cgi?action=stats&p=3&u=Werkhof-Darmstadt
Vielen Dank nochmal!!
Gruß
Manuel