Wie kann ich eine Abfragezeichenfolge in Python urlencodieren?

Lesezeit: 5 Minuten

Benutzer-Avatar
James

Ich versuche, diese Zeichenfolge vor dem Absenden mit einem URL zu codieren.

queryString = 'eventName=" + evt.fields["eventName"] + "&' + 'eventDescription=' + evt.fields["eventDescription"]; 

Benutzer-Avatar
Ricky Sahu

Python 2

Was Sie suchen, ist urllib.quote_plus:

safe_string = urllib.quote_plus('string_of_characters_like_these:$#@=?%^Q^$')

#Value: 'string_of_characters_like_these%3A%24%23%40%3D%3F%25%5EQ%5E%24'

Python 3

In Python 3 ist die urllib Paket wurde in kleinere Komponenten zerlegt. Sie werden verwenden urllib.parse.quote_plus (beachten Sie das parse untergeordnetes Modul)

import urllib.parse
safe_string = urllib.parse.quote_plus(...)

  • Vielen Dank! In meinem Fall muss ich jedoch Folgendes angeben: import urllib.parse ... urllib.parse.quote_plus(query)

    – ivkremer

    2. September 2014 um 11:53 Uhr

  • Sehr gut, aber warum wird Unicode nicht verwendet? Wenn die URL-Zeichenfolge Unicode ist, muss ich sie in UTF-8 codieren. Gibt es eine andere Möglichkeit, dies zu tun?

    – Karl Dönitz

    6. Februar 2015 um 6:55 Uhr

  • Das funktioniert großartig, aber ich konnte nicht auf einige Online-Dienste (REST) ​​zugreifen, bis ich diesen Parameter safe=’;/?:@&=+$,’ hinzugefügt habe.

    – Rowyko

    29. Mai 2015 um 14:56 Uhr

  • python3 -c "import urllib.parse, sys; print(urllib.parse.quote_plus(sys.argv[1])) "string to encode" für einen Einzeiler auf der Kommandozeile

    – Amos Josua

    8. Mai 2019 um 12:19 Uhr

  • @AmosJoshua Ich glaube, du hast ein doppeltes Anführungszeichen verpasst " direkt nach den doppelten runden schließenden Klammern ))es sollte sein: python3 -c "import urllib.parse, sys; print(urllib.parse.quote_plus(sys.argv[1]))" "string to encode"

    – lgespeed

    2. November 2021 um 19:04 Uhr


Benutzer-Avatar
bgporter

Sie müssen Ihre Parameter übergeben urlencode() entweder als Mapping (dict) oder als Folge von 2-Tupeln, wie:

>>> import urllib
>>> f = { 'eventName' : 'myEvent', 'eventDescription' : 'cool event'}
>>> urllib.urlencode(f)
'eventName=myEvent&eventDescription=cool+event'

Python 3 oder höher

Verwenden urllib.parse.urlencode:

>>> urllib.parse.urlencode(f)
eventName=myEvent&eventDescription=cool+event

Beachten Sie, dass dies der Fall ist nicht URL-Kodierung im üblichen Sinne durchführen (siehe Ausgabe). Für diese Verwendung urllib.parse.quote_plus.

  • „Beachten Sie, dass urllib.urlencode nicht immer ausreicht. Das Problem ist, dass einige Dienste sich um die Reihenfolge der Argumente kümmern, die verloren geht, wenn Sie das Wörterbuch erstellen. Für solche Fälle ist urllib.quote_plus besser, wie Ricky vorgeschlagen hat. “

    – Blairg23

    17. August 2015 um 21:35 Uhr

  • Technisch gesehen ist das ein Fehler in den Diensten, oder?

    – Holdenweb

    19. August 2015 um 9:52 Uhr

  • und wie würde man dies tun, wenn Sie nur eine Zeichenfolgen-URL sicher machen möchten, ohne eine vollständige Abfrageargumentzeichenfolge zu erstellen?

    – Mike „Pomax“ Kamermans

    7. Juni 2016 um 2:14 Uhr

  • @Mike’Pomax’Kamermans – siehe zB stackoverflow.com/questions/12082314/… oder Rickys Antwort auf diese Frage.

    – bgporter

    7. Juni 2016 um 12:12 Uhr


  • @bk0 Es scheint, dass Ihre Methode nur für Wörterbücher und nicht für Zeichenfolgen gültig ist.

    – JD Gamboa

    2. Februar 2018 um 22:23 Uhr

Benutzer-Avatar
Barney Szabolcs

Versuchen Anfragen anstelle von urllib und Sie brauchen sich nicht um urlencode zu kümmern!

import requests
requests.get('http://youraddress.com', params=evt.fields)

BEARBEITEN:

Wenn Sie brauchen geordnete Name-Wert-Paare oder mehrere Werte für einen Namen, dann legen Sie Parameter wie folgt fest:

params=[('name1','value11'), ('name1','value12'), ('name2','value21'), ...]

anstatt ein Wörterbuch zu verwenden.

  • Dies behandelt nicht das Problem der Reihenfolge der Name-Wert-Paare, außerdem erfordert dies die Erlaubnis, externe Bibliotheken zu installieren, die für das Projekt möglicherweise nicht machbar sind.

    – dreftymac

    6. September 2013 um 2:10 Uhr

  • Ich habe den minimalen Code gepostet, der für das OP funktionieren würde. Das OP hat keine bestellten Paare angefordert, aber es ist auch machbar, siehe mein Update.

    – Barney Szabolcs

    10. September 2013 um 8:02 Uhr

  • @dreftymac: Dies betrifft die Bestellung (obwohl dies nicht Teil der Frage war). Bitte lesen Sie meine aktualisierte Antwort.

    – Barney Szabolcs

    25. November 2013 um 20:26 Uhr


Benutzer-Avatar
dreftymac

Kontext

  • Python (Version 2.7.2)

Problem

  • Sie möchten eine URL-codierte Abfragezeichenfolge generieren.
  • Sie haben ein Wörterbuch oder Objekt, das die Name-Wert-Paare enthält.
  • Sie möchten die Ausgabereihenfolge der Name-Wert-Paare steuern können.

Lösung

  • urllib.urlencode
  • urllib.quote_plus

Tücken

  • Dictionary-Ausgabe willkürliche Reihenfolge von Name-Wert-Paaren
    • (siehe auch: Warum ordnet Python mein Wörterbuch so?)
    • (siehe auch: Warum ist die Reihenfolge in Wörterbüchern und Sets willkürlich?)
  • Umgang mit Fällen, wenn Sie UNTERLASSEN SIE Achten Sie auf die Reihenfolge der Name-Wert-Paare
  • Umgang mit Fällen, wenn Sie TUN Achten Sie auf die Reihenfolge der Name-Wert-Paare
  • Behandlung von Fällen, in denen ein einzelner Name mehr als einmal in der Menge aller Name-Wert-Paare vorkommen muss

Beispiel

Das Folgende ist eine vollständige Lösung, einschließlich des Umgangs mit einigen Fallstricken.

### ********************
## init python (version 2.7.2 )
import urllib

### ********************
## first setup a dictionary of name-value pairs
dict_name_value_pairs = {
  "bravo"   : "True != False",
  "alpha"   : "http://www.example.com",
  "charlie" : "hello world",
  "delta"   : "1234567 !@#$%^&*",
  "echo"    : "[email protected]",
  }

### ********************
## setup an exact ordering for the name-value pairs
ary_ordered_names = []
ary_ordered_names.append('alpha')
ary_ordered_names.append('bravo')
ary_ordered_names.append('charlie')
ary_ordered_names.append('delta')
ary_ordered_names.append('echo')

### ********************
## show the output results
if('NO we DO NOT care about the ordering of name-value pairs'):
  queryString  = urllib.urlencode(dict_name_value_pairs)
  print queryString 
  """
  echo=user%40example.com&bravo=True+%21%3D+False&delta=1234567+%21%40%23%24%25%5E%26%2A&charlie=hello+world&alpha=http%3A%2F%2Fwww.example.com
  """

if('YES we DO care about the ordering of name-value pairs'):
  queryString  = "&".join( [ item+'='+urllib.quote_plus(dict_name_value_pairs[item]) for item in ary_ordered_names ] )
  print queryString
  """
  alpha=http%3A%2F%2Fwww.example.com&bravo=True+%21%3D+False&charlie=hello+world&delta=1234567+%21%40%23%24%25%5E%26%2A&echo=user%40example.com
  """ 

Python3:

urllib.parse.quote_plus(string, safe=””, Codierung=Keine, Fehler=Keine)

  • ich bevorzuge urllib.parse.quote() mich da es verwendet %20 statt +.

    – binki

    29. September 2015 um 20:43 Uhr

Versuche dies:

urllib.pathname2url(stringToURLEncode)

urlencode funktioniert nicht, weil es nur auf Wörterbüchern funktioniert. quote_plus hat nicht die richtige Ausgabe erzeugt.

  • ich bevorzuge urllib.parse.quote() mich da es verwendet %20 statt +.

    – binki

    29. September 2015 um 20:43 Uhr

Benutzer-Avatar
Adam

Beachten Sie, dass urllib.urlencode nicht immer ausreicht. Das Problem ist, dass einige Dienste sich um die Reihenfolge der Argumente kümmern, die beim Erstellen des Wörterbuchs verloren geht. Für solche Fälle ist urllib.quote_plus besser, wie Ricky vorgeschlagen hat.

  • Es funktioniert gut und behält die Reihenfolge bei, wenn Sie eine Liste von Tupeln übergeben: >>> import urllib >>> urllib.urlencode([('name', 'brandon'), ('uid', 1000)]) 'name=brandon&uid=1000'

    – Brandon Rhodes

    16. März 2017 um 21:07 Uhr

1131250cookie-checkWie kann ich eine Abfragezeichenfolge in Python urlencodieren?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy