ampersand-Übergabe an Google-Formular durch Mechanize
poiuz
- html
Hallo Forum,
gegoogelt habe ich, SELFHTML-Foren durchforstet auch schon, vielleicht ist es auch nur Begriffsstutzigkeit!
Also: Ich übergebe in einem Perl-Script durch www:Mechanize Suchbegriffe an die Google-Suchmaske (im Firefox).
Dabei wird & (das alleinstehende kaufmännische Und) als & an die Google-Suchmaske übergeben. Dadurch wird das Suchergebnis natürlich verfälscht. Zu Erkennen dadurch, daß bei "händischen" Google-Suchen die Ergebnisse für Texte mit & bzw. $amp; völlig verschieden sind.
Wo liegt mein Denkfehler?
Im Voraus: Danke für die Denk-Mithilfe
Poiuz
Also: Ich übergebe in einem Perl-Script durch www:Mechanize Suchbegriffe an die Google-Suchmaske (im Firefox).
Dabei wird & (das alleinstehende kaufmännische Und) als & an die Google-Suchmaske übergeben. Dadurch wird das Suchergebnis natürlich verfälscht. Zu Erkennen dadurch, daß bei "händischen" Google-Suchen die Ergebnisse für Texte mit & bzw. $amp; völlig verschieden sind.
Wo liegt mein Denkfehler?
Handelt es sich bei besagtem & um das Trennzeichen im Querystring,, oder handelt es sich um einen Teil im Parameterwert?
Wer erstellt die "Google Suchmaske" ?
Seit wann hat Firefox eine Google-Suchmaske?
mfg Beat
Hallo Beat, danke für die (für mich zu schnelle )schnelle Antwort - war kurz außerhaus.
Also: Ich übergebe in einem Perl-Script durch www:Mechanize Suchbegriffe an die Google-Suchmaske (im Firefox).
Dabei wird & (das alleinstehende kaufmännische Und) als & an die Google-Suchmaske übergeben. Dadurch wird das Suchergebnis natürlich verfälscht. Zu Erkennen dadurch, daß bei "händischen" Google-Suchen die Ergebnisse für Texte mit & bzw. $amp; völlig verschieden sind.
Wo liegt mein Denkfehler?Handelt es sich bei besagtem & um das Trennzeichen im Querystring,, oder handelt es sich um einen Teil im Parameterwert?
Beispiel: "hut & mantel"
Wer erstellt die "Google Suchmaske" ?
Seit wann hat Firefox eine Google-Suchmaske?
Codesnippet:
use WWW::Mechanize;
my $a = WWW::Mechanize->new(onerror => &fehler()); #autocheck => 1
$a->agent_alias("Linux Mozilla");
$a->get("http://www.google.de/advanced_search?hl=de");
if ($a->content() =~ m/Google/)
{
$a->submit_form("form_number" => "1",
"fields" => {
"num" => "100",
"as_epq" => "hut & mantel", #mit der genauen Wortgruppe
"as_qdr" => "w",
},
"title" =>"Google-Suche"
);
if ($a->success())
{
green();print "<h2>--</h2>";black();
}
else
{
red();print "<h2>q81q Anmeldung fehlgeschlagen</h2>";black();
}
}
else
{
red(); print" qa81q Google nicht gefunden<br>";black();
}
my $erfolg = $a->content();
print "$erfolg<br>";
anhalten();
mfg Beat
if ($a->content() =~ m/Google/)
{
$a->submit_form("form_number" => "1",
"fields" => {
"num" => "100",
"as_epq" => "hut & mantel", #mit der genauen Wortgruppe
"as_qdr" => "w",
},
"title" =>"Google-Suche"
);
Was sagt WWW::Mechanize bezüglich urlencoding der zu submittenden Daten?
mfg Beat
if ($a->content() =~ m/Google/)
{
$a->submit_form("form_number" => "1",
"fields" => {
"num" => "100",
"as_epq" => "hut & mantel", #mit der genauen Wortgruppe
"as_qdr" => "w",
},
"title" =>"Google-Suche"
);Was sagt WWW::Mechanize bezüglich urlencoding der zu submittenden Daten?
mfg Beat
...da ich kein routinierter Programmierer bin, kann ich hier nur vage antworten:
Ich habe es mit
...
$suchsatz="Hut & Mantel";
$suchsatz =~ s/&/%26/g;
"as_epq" => $suchsatz,
...
versucht, natürlich steht dann in der Google-Suchzeile: "Hut %26 Mantel". Gibt es außer $amp; und %26 noch eine andere Möglichkeit & zu codieren?
mfg
Poiuz
h1,
Gibt es außer $amp; und %26 noch eine andere Möglichkeit & zu codieren?
Die Zeichenreferenz selbst:
hex: &
dez: &
Probiers einfach.
Hotti
h1,
Gibt es außer $amp; und %26 noch eine andere Möglichkeit & zu codieren?
Die Zeichenreferenz selbst:
hex: &
dez: &Probiers einfach.
Hotti
...Danke Hotti,
hab` ich gerade ausprobiert - keins von beiden funktioniert. Auch in diesem Fall erscheint die Zeichenreferenz in der Google-Suchzeile und nicht das gewünschte & - Zeichen allein.
Wo kann ich noch weiterbohren?
mfg
Poiuz
hi,
Wo kann ich noch weiterbohren?
Also wenn ich in google ein & eingebe, wird das zu %26, das macht der Browser. Wenn Du das mit Perl machen willst, nimm URI::Escape.
Hotti
Hallo,
Also: Ich übergebe in einem Perl-Script durch www:Mechanize Suchbegriffe an die Google-Suchmaske (im Firefox).
wie jetzt - erzeugst du mit einem Perl-Script HTML, oder sendest du einen Request direkt an den Google-Server? Deiner Beschreibung nach vermute ich eher letzteres.
Dabei wird & (das alleinstehende kaufmännische Und) als & an die Google-Suchmaske übergeben.
Das ist falsch. Nur im HTML-Kontext wird & als & maskiert. Im URL-Kontext, der hier vermutlich vorliegt, wird & als %26 maskiert - aber nur, wenn es als Nutzzeichen gelten soll. Wenn es als Trennzeichen zwischen mehreren URL-Parametern dient, wird es im URL-Kontext gar nicht maskiert.
Dadurch wird das Suchergebnis natürlich verfälscht. Zu Erkennen dadurch, daß bei "händischen" Google-Suchen die Ergebnisse für Texte mit & bzw. $amp; völlig verschieden sind.
Natürlich.
Wo liegt mein Denkfehler?
In der fehlerhaften Kontext-Betrachtung.
Ciao,
Martin
Hallo Martin,
danke für die Antwort.
Also: Ich übergebe in einem Perl-Script durch www:Mechanize Suchbegriffe an die Google-Suchmaske (im Firefox).
wie jetzt - erzeugst du mit einem Perl-Script HTML, oder sendest du einen Request direkt an den Google-Server? Deiner Beschreibung nach vermute ich eher letzteres.
Letzteres stimmt.
Dabei wird & (das alleinstehende kaufmännische Und) als & an die Google-Suchmaske übergeben.
Das ist falsch. Nur im HTML-Kontext wird & als & maskiert. Im URL-Kontext, der hier vermutlich vorliegt, wird & als %26 maskiert - aber nur, wenn es als Nutzzeichen gelten soll. Wenn es als Trennzeichen zwischen mehreren URL-Parametern dient, wird es im URL-Kontext gar nicht maskiert.
Sieht aber doch so aus. Oder könnte das in Mechanize beim "submit_form-Befehl" geschehen?
Dadurch wird das Suchergebnis natürlich verfälscht. Zu Erkennen dadurch, daß bei "händischen" Google-Suchen die Ergebnisse für Texte mit & bzw. $amp; völlig verschieden sind.
Natürlich.
Wo liegt mein Denkfehler?
In der fehlerhaften Kontext-Betrachtung.
Kannst Du mir noch weiterhelfen?
Danke
Poiuz
Hi,
Nur im HTML-Kontext wird & als & maskiert. Im URL-Kontext, der hier vermutlich vorliegt, wird & als %26 maskiert - aber nur, wenn es als Nutzzeichen gelten soll. Wenn es als Trennzeichen zwischen mehreren URL-Parametern dient, wird es im URL-Kontext gar nicht maskiert.
Sieht aber doch so aus. Oder könnte das in Mechanize beim "submit_form-Befehl" geschehen?
ich habe keine Ahnung von Perl und weiß daher nicht, was die einzelnen Komponenten für Magie einfließen lassen.
Wo liegt mein Denkfehler?
In der fehlerhaften Kontext-Betrachtung.
Kannst Du mir noch weiterhelfen?
Okay. Nehmen wir ein abstraktes Beispiel: Ich möchte die Ressource http://example.org/ aufrufen und ihr mehrere URL-Parameter übergeben. Also müsste der HTTP-Request lauten:
[1] http://example.org/?param1=value1¶m2=value2¶m3=value3
Das & wird also in diesem Kontext gar nicht maskiert, weil es beim Server in seiner Sonderbedeutung als Trennzeichen zwischen den URL-Parametern verstanden werden soll.
Nun soll param1 den Wert "copy&paste" haben (das sind die Kollegen von Smith&Wesson). Dieses & soll *nicht* die oben beschriebene Sonderbedeutung haben, sondern ist "wörtlich" gemeint und muss daher maskiert werden. Da wir im URL-Kontext sind, mit der URL-Codierung:
[2] http://example.org/?param1=copy%26paste¶m2=value2¶m3=value3
Im dritten Schritt wollen wir diesen Request als Link in einem HTML-Dokument notieren. In HTML muss das & maskiert werden, da es ansonsten eine Entity-Referenz oder NCR einleitet. Also muss & zu & werden:
[3] http://example.org/?param1=copy%26paste&param2=value2&param3=value3
Diese Maskierung macht der Browser bereits beim Interpretieren des HTML-Quellcodes rückgängig. Wenn der Link [3] angeklickt wird, entsteht daraus also wieder die URL-Notation [2].
Wenn du jetzt fälschlicherweise außerhalb des HTML-Kontexts ein & als & notierst und das so in den HTTP-Request einbringst, kommt der als [3] gezeigte String beim Server an. Dann würde ein serverseitiges Script zwar immer noch drei URL-Parameter erkennen, aber mit falschen Namen:
param1=copy%26paste
amp;param2=value2
amp;param3=value3
Eventuell hast du sogar Glück, und die serverseitige Scriptlogik ist so konfiguriert, dass sie alternativ auch ein Semikolon als Trennzeichen von URL-Parametern akzeptiert (wird oft empfohlen). Dann würde diese Logik fünf URL-Parameter erkennen, wobei zwei davon den gleichen Namen haben:
param1=copy%26paste
amp
param2=value2
amp
param3=value3
Da Scripte in der Regel per Namen auf die URL-Parameter zugreifen und nicht per numerischem Index, würde das sogar trotz des fehlerhaften Requests funktionieren. Richtig ist es dennoch nicht.
Ist es nun klarer? Wenn nicht, frage bitte konkret, weil ich nicht ahnen kann, wo sonst deine Verständnislücken sind.
So long,
Martin
Hi @Martin und @hotti,
...danke für die ausführlichen Erläuterungen.
Mit dem "submit_form-Befehl" in WWW:Mechanize wird ein Formular (in meinem Fall die Query-Zeile von Google) ausgefüllt und abgeschickt.
Hier eben geschieht die "Magie", ich gebe & ein und in der Query-Zeile steht &. Inzwischen gehe ich davon aus, daß es, wie hotti schreibt, über Google ausgelöst wird. Werde mich jetzt mal mit URI::Escape beschäftigen.
Nochmals Danke an alle!
Poiuz
Hier eben geschieht die "Magie", ich gebe & ein und in der Query-Zeile steht &. Inzwischen gehe ich davon aus, daß es, wie hotti schreibt, über Google ausgelöst wird. Werde mich jetzt mal mit URI::Escape beschäftigen.
Google wandelt keine Zeichen in diese HTML-Kodierung um, außer zur Darstellung. Wenn in der URL %26 steht, ist dies ja korrekt. Wenn nicht würde ich trotzdem nicht bei Google ansetzen.
Außer du gehst davon aus, das Google deine Aktion nicht mag und unterbinden möchte.
Da ich von Perl keine Ahung habe, weis ich leider nicht was du falsch machst, jedoch weis ich was dein Objekt liefern muss:
http://www.google.de/search?q=Hut+%26+Mantel
Ich würde vieleicht diese anfrage von Google auf etwas auf deinem Server umbiegen und mal anschauen, was hinten aus deinem Objekt herauskommt.