it-swarm.com.de

Wie kann man einen Querystring in Python urlencodieren?

Ich versuche, diese Zeichenfolge zu urlencodieren, bevor ich sie übergebe. 

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

Sie müssen Ihre Parameter in 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

Benutzen:

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

Beachten Sie, dass dies nicht URL-Kodierung im häufig verwendeten Sinn ist (siehe Ausgabe). Verwenden Sie dazu urllib.parse.quote_plus.

464
bgporter

Python 2

Was Sie suchen, ist urllib.quote_plus :

>>> urllib.quote_plus('string_of_characters_like_these:$#@=?%^Q^$')
'string_of_characters_like_these%3A%24%23%40%3D%3F%25%5EQ%5E%24'

Python 3

In Python 3 wurde das Paket urllib in kleinere Komponenten aufgeteilt. Sie verwenden urllib.parse.quote_plus (beachten Sie das untergeordnete Modul parse).

import urllib.parse
urllib.parse.quote_plus(...)
920
Ricky

Kontext

  • Python (Version 2.7.2)

Problem

  • Sie möchten eine urlencodierte Abfragezeichenfolge generieren.
  • Sie haben ein Wörterbuch oder ein 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

Fallstricke

Beispiel

Im Folgenden finden Sie 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 [email protected]#$%^&*",
  "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
  """ 
37
dreftymac

Testen Sie Requests anstelle von urllib und Sie müssen sich nicht mit urlencode beschäftigen!

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

EDIT:

Wenn Sie geordnete Name-Wert-Paare oder mehrere Werte für einen Namen benötigen, setzen Sie die Parameter wie folgt:

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

anstatt ein Wörterbuch zu verwenden.

34
25
Janus Troelsen

Beachten Sie, dass der urllib.urlencode den Trick nicht immer macht. Das Problem ist, dass einige Dienste auf die Reihenfolge der Argumente achten, die beim Erstellen des Wörterbuchs verloren gehen. In solchen Fällen ist urllib.quote_plus besser, wie Ricky vorgeschlagen hat.

21
user411279

Versuche dies:

urllib.pathname2url(stringToURLEncode)

urlencode funktioniert nicht, da sie nur für Wörterbücher funktioniert. quote_plus hat nicht die korrekte Ausgabe erzeugt.

20
Charlie

In Python 3 hat das mit mir funktioniert

import urllib

urllib.parse.quote(query)
7
Mazen Aly

für zukünftige Referenzen (zB: für Python3)

>>> import urllib.request as req
>>> query = 'eventName=theEvent&eventDescription=testDesc'
>>> req.pathname2url(query)
>>> 'eventName%3DtheEvent%26eventDescription%3DtestDesc'
4
nickanor

Wenn ururib.parse.urlencode () Fehler anzeigt, probieren Sie das Modul urllib3 aus.

Die Syntax lautet wie folgt: 

import urllib3
urllib3.request.urlencode({"user" : "john" }) 
2
Natesh bhat

Für die Verwendung in Skripten/Programmen, die sowohl Python 2 als auch 3 unterstützen müssen, bietet das Modul sechs Funktionen für das Angebots- und Urlencode-Verhalten:

>>> from six.moves.urllib.parse import urlencode, quote
>>> data = {'some': 'query', 'for': 'encoding'}
>>> urlencode(data)
'some=query&for=encoding'
>>> url = '/some/url/with spaces and %;!<>&'
>>> quote(url)
'/some/url/with%20spaces%20and%20%25%3B%21%3C%3E%26'
1
bschlueter

Eine andere Sache, die möglicherweise nicht bereits erwähnt wurde, ist, dass urllib.urlencode() leere Werte im Wörterbuch als Zeichenfolge None codiert, anstatt diesen Parameter als fehlend zu kennzeichnen. Ich weiß nicht, ob dies normalerweise erwünscht ist oder nicht, aber es passt nicht zu meinem Anwendungsfall. Daher muss ich quote_plus verwenden.

0
Joseph