web-dev-qa-db-fra.com

Comment urlencoder une chaîne de requête en Python?

J'essaye de coder cette chaîne avant de la soumettre. 

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

Vous devez passer vos paramètres dans urlencode() sous forme de mappage (dict) ou de séquence de 2-tuples, comme:

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

Python 3 ou supérieur

Utilisation:

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

Notez que ceci fait non _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _} Pour cela, utilisez urllib.parse.quote_plus.

464
bgporter

Python 2

Ce que vous cherchez, c'est 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

Dans Python 3, le package urllib a été divisé en composants plus petits. Vous utiliserez urllib.parse.quote_plus (notez le module enfant parse)

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

Le contexte

  • Python (version 2.7.2)

Problème

  • Vous voulez générer une chaîne de requête codée par url.
  • Vous avez un dictionnaire ou un objet contenant les paires nom-valeur.
  • Vous voulez pouvoir contrôler l'ordre de sortie des paires nom-valeur.

Solution

  • urllib.urlencode
  • urllib.quote_plus

Les pièges

Exemple

Ce qui suit est une solution complète, y compris la façon de gérer certains écueils.

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

Essayez demandes au lieu de urllib et vous n’aurez plus besoin de vous embêter avec urlencode!

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

MODIFIER:

Si vous avez besoin de ordonné paires nom-valeur ou de plusieurs valeurs pour un nom, définissez les paramètres comme suit:

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

au lieu d'utiliser un dictionnaire.

34
Barnabas Szabolcs
25
Janus Troelsen

Notez que le urllib.urlencode ne fait pas toujours l'affaire. Le problème est que certains services se soucient de l'ordre des arguments, qui sont perdus lorsque vous créez le dictionnaire. Dans ces cas, urllib.quote_plus est préférable, comme l’a suggéré Ricky.

21
user411279

Essaye ça:

urllib.pathname2url(stringToURLEncode)

urlencode ne fonctionnera pas car cela ne fonctionne que sur les dictionnaires. quote_plus n'a pas produit le bon résultat.

20
Charlie

En Python 3, cela a fonctionné avec moi

import urllib

urllib.parse.quote(query)
7
Mazen Aly

pour les références futures (ex: pour python3)

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

Si la fonction urllib.parse.urlencode () vous renvoie des erreurs, essayez le module urllib3.

La syntaxe est la suivante: 

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

Pour une utilisation dans les scripts/programmes devant prendre en charge Python 2 et 3, les six modules fournissent les fonctions quote et urlencode:

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

Une autre chose qui n’aurait peut-être pas déjà été mentionnée est que urllib.urlencode() encodera les valeurs vides du dictionnaire sous la forme de la chaîne None au lieu d’avoir ce paramètre comme absent. Je ne sais pas si cela est généralement souhaité ou non, mais ne correspond pas à mon cas d'utilisation, je dois donc utiliser quote_plus.

0
Joseph