poiuz: ampersand-Übergabe an Google-Formular durch Mechanize

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

  1. 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

    --
    ><o(((°>           ><o(((°>
       <°)))o><                     ><o(((°>o
    Der Valigator leibt diese Fische
    1. 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 &amp; 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

      1. 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

        --
        ><o(((°>           ><o(((°>
           <°)))o><                     ><o(((°>o
        Der Valigator leibt diese Fische
        1. 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

          1. h1,

            Gibt es außer $amp; und %26 noch eine andere Möglichkeit & zu codieren?

            Die Zeichenreferenz selbst:
            hex: &#x26;
            dez: &#38;

            Probiers einfach.

            Hotti

            1. h1,

              Gibt es außer $amp; und %26 noch eine andere Möglichkeit & zu codieren?

              Die Zeichenreferenz selbst:
              hex: &#x26;
              dez: &#38;

              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

              1. 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

  2. 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 &amp; an die Google-Suchmaske übergeben.

    Das ist falsch. Nur im HTML-Kontext wird & als &amp; 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

    --
    Lieber arm dran als Arm ab.
    1. 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 &amp; an die Google-Suchmaske übergeben.

      Das ist falsch. Nur im HTML-Kontext wird & als &amp; 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

      1. Hi,

        Nur im HTML-Kontext wird & als &amp; 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&param2=value2&param3=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&param2=value2&param3=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 &amp; werden:

        [3] http://example.org/?param1=copy%26paste&amp;param2=value2&amp;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 &amp; 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

        --
        Man soll den Tag nicht vor dem Abend loben.
        Und den Mann nicht vor dem Morgen.
          (alte Volksweisheit)
        1. 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 &amp;. 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

          1. Hier eben geschieht die "Magie", ich gebe & ein und in der Query-Zeile steht &amp;. 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.