Wie konvertiere ich ein Wörterbuch in eine Abfragezeichenfolge in Python?

Antworten:

157

Python 3

urllib.parse.urlencode(Abfrage, doseq = False, [...])

Konvertieren Sie ein Zuordnungsobjekt oder eine Folge von Tupeln mit zwei Elementen, die Str- oder Byte-Objekte enthalten können, in eine prozentual codierte ASCII-Textzeichenfolge.

- Python 3- urllib.parseDokumente

A dictist eine Abbildung.

Legacy Python

urllib.urlencode( query[, doseq])
Konvertieren Sie ein Zuordnungsobjekt oder eine Folge von Tupeln mit zwei Elementen in eine "prozentcodierte" Zeichenfolge ... eine Reihe von key=valuePaaren, die durch '&'Zeichen getrennt sind ...

- Python 2.7- urllibDokumente

Ignacio Vazquez-Abrams
quelle
1
Dies ist wahr, aber das dictzurückgegebene von hat cgi.parse_qs()tatsächlich lists als "Werte". Wenn Sie diese direkt übergeben, werden sehr seltsam aussehende Abfragezeichenfolgen erstellt.
Johnsyweb
Wahr genug. Das bringt mir bei, mehr als den ersten Satz zu lesen!
Johnsyweb
18
urllib.parse.urlencode in Python 3.
Denilson Sá Maia
Das Problem ist, dass Urlencode Leerzeichen in + konvertiert, was nicht empfohlen wird.
user1633272
1
@ user1633272: Nicht empfohlen nach wem?
Ignacio Vazquez-Abrams
65

In Python3 etwas anders:

from urllib.parse import urlencode
urlencode({'pram1': 'foo', 'param2': 'bar'})

Ausgabe: 'pram1=foo&param2=bar'

Versuchen Sie Folgendes, um die Kompatibilität mit Python2 und Python3 zu gewährleisten:

try:
    #python2
    from urllib import urlencode
except ImportError:
    #python3
    from urllib.parse import urlencode
Johnny Zhao
quelle
6

Sie suchen genau so etwas urllib.urlencode()!

Wenn Sie jedoch parse_qs()(anders als parse_qsl()) aufrufen , sind die Wörterbuchschlüssel die eindeutigen Namen der Abfragevariablen und die Werte sind Wertelisten für jeden Namen.

Um diese Informationen weiterzugeben urllib.urlencode(), müssen Sie diese Listen "reduzieren". So können Sie es mit einer Liste von Tupeln machen:

query_pairs = [(k,v) for k,vlist in d.iteritems() for v in vlist]
urllib.urlencode(query_pairs)
Johnsyweb
quelle
15
Oder du könntest bestehen doseq=True.
Ignacio Vazquez-Abrams
@downvoter: Wie könnte ich diese Antwort verbessern? Es ist sechs Jahre her, seit ich es geschrieben habe!
Johnsyweb
-1

Vielleicht suchen Sie so etwas:

def dictToQuery(d):
  query = ''
  for key in d.keys():
    query += str(key) + '=' + str(d[key]) + "&"
  return query

Es nimmt ein Wörterbuch und konvertiert es in eine Abfragezeichenfolge, genau wie Urlencode. Es wird ein abschließendes "&" an die Abfragezeichenfolge angehängt, dies wird jedoch return query[:-1]behoben, wenn es sich um ein Problem handelt.

Garbados
quelle
4
Hast du dich schon getroffen str.join()? Wie wäre es urllib.quote_plus()?
Ignacio Vazquez-Abrams
1
@garbados Ihre Lösung sollte in einfachen Fällen funktionieren. Schauen Sie jedoch urlencodein urllib.py(dies sollte in Ihrer Python-Installation der Fall sein) nach, warum das Erstellen einer Abfragezeichenfolge manchmal nicht ganz so einfach ist, wie es Ihre Antwort impliziert (insbesondere die Notwendigkeit, bestimmte Zeichen, die in a nicht gültig sind, in Anführungszeichen zu setzen) URL). @Ignacio hat auch auf zwei Funktionen verwiesen, die Ihre Implementierung bereinigen und korrigieren würden.
Anthony Cramp
Ah, in der Tat. Entschuldigung für die grobe Implementierung. Dies zeigt, dass ich vorsichtiger Fragen beantworten sollte, mit denen ich mich noch nie konfrontiert sah.
Garbados
Dies ist vielleicht nicht die beste Antwort, aber genau das wollte ich sehen, als ich auf den Titel dieser Frage geklickt habe. Ich habe nur 4 Elemente in einem Diktat, die ich in ein Name = Wert-Paar verwandeln muss, das durch ein '&' getrennt ist. Meine Werte werden kontrolliert. Das str.join () ist in meinem Fall praktisch, aber ich brauche kein quote_plus (), da es kein öffentlich zugänglicher Code ist :) Danke!
Harperville
1
@harperville aber der korrektere Weg ( from urllib.parse import urlencode; urlencode(your_dict)) ist kürzer und einfacher als dieser! Ich gebe zu, dass es manchmal klug ist, das Rad neu zu erfinden, selbst wenn es teuer oder unpraktisch ist, auf vorhandene, gut gestaltete Räder zuzugreifen, aber hier ist die Verwendung des Standardrads einfacher und schneller als das Rollen Ihres eigenen minderwertigen .
Mark Amery