761 Stimmen

Wie kann man einen Querystring in Python urlencodieren?

Ich versuche, diese Zeichenfolge vor dem Absenden zu verschlüsseln.

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

1300voto

Ricky Sahu Punkte 21493

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 aufgeteilt. Sie verwenden urllib.parse.quote_plus (Beachten Sie die parse Kind-Modul)

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

723voto

bgporter Punkte 33367

Sie müssen Ihre Parameter in urlencode() entweder als eine Abbildung (dict) oder als eine 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

Utilice urllib.parse.urlencode :

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

Beachten Sie, dass dies no die Url-Kodierung im üblichen Sinne durchführen (siehe die Ausgabe). Verwenden Sie dazu urllib.parse.quote_plus .

97voto

Barney Szabolcs Punkte 11037

Versuchen Sie Anfragen anstelle von urllib und Sie müssen sich nicht mit urlencode herumschlagen!

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

EDITAR:

Wenn Sie geordnete Name-Werte-Paare oder mehrere Werte für einen Namen, dann setzen Sie params wie folgt:

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

anstatt ein Wörterbuch zu verwenden.

41voto

dreftymac Punkte 29452

Kontext

  • Python (Version 2.7.2)

Problem

  • Sie möchten einen urlencodierten Abfrage-String erzeugen.
  • Sie haben ein Wörterbuch oder ein Objekt, das die Name-Wert-Paare enthält.
  • Sie möchten die Reihenfolge der Ausgabe 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, die auch einige Fallstricke enthält.

### ********************
## 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"    : "user@example.com",
  }

### ********************
## 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
  """

36voto

Janus Troelsen Punkte 19028

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X