J'essaye de coder cette chaîne avant de la soumettre.
queryString = 'eventName=' + evt.fields["eventName"] + '&' + 'eventDescription=' + evt.fields["eventDescription"];
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
.
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'
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(...)
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
"""
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.
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.
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.
En Python 3, cela a fonctionné avec moi
import urllib
urllib.parse.quote(query)
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'
La syntaxe est la suivante:
import urllib3
urllib3.request.urlencode({"user" : "john" })
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'
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
.