Réponses:
Vous devez passer vos paramètres 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 cela ne fait pas de codage d'URL dans le sens couramment utilisé (regardez la sortie). Pour cette utilisation urllib.parse.quote_plus
.
Ce que vous recherchez, 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'
En Python 3, le urllib
package a été divisé en composants plus petits. Vous utiliserez urllib.parse.quote_plus
(notez le parse
module enfant)
import urllib.parse
urllib.parse.quote_plus(...)
import urllib.parse ... urllib.parse.quote_plus(query)
python3 -c "import urllib.parse, sys; print(urllib.parse.quote_plus(sys.argv[1])) "string to encode"
pour un one liner sur la ligne de commande
Essayez les demandes au lieu de urllib et vous n'aurez pas à vous soucier de l'urlencode!
import requests
requests.get('http://youraddress.com', params=evt.fields)
ÉDITER:
Si vous avez besoin de paires nom-valeur ordonnées 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.
Ce qui suit est une solution complète, y compris comment gérer certains pièges.
### ********************
## 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
"""
urllib.parse.quote()
me préfère car il utilise %20
plutôt que +
.
Essaye ça:
urllib.pathname2url(stringToURLEncode)
urlencode
ne fonctionnera pas car il ne fonctionne que sur les dictionnaires. quote_plus
n'a pas produit la sortie correcte.
my string
à my%20string
. Votre solution fonctionne comme un charme pour ça!
%20
au lieu de +
. Merci
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 est perdu lorsque vous créez le dictionnaire. Pour de tels cas, urllib.quote_plus est meilleur, comme l'a suggéré Ricky.
>>> import urllib >>> urllib.urlencode([('name', 'brandon'), ('uid', 1000)]) 'name=brandon&uid=1000'
pour les futures références (ex: pour python3)
>>> import urllib.request as req
>>> query = 'eventName=theEvent&eventDescription=testDesc'
>>> req.pathname2url(query)
>>> 'eventName%3DtheEvent%26eventDescription%3DtestDesc'
'c:/2 < 3'
sous Windows est '///C://2%20%3C%203'
. Je veux quelque chose qui ne ferait que sortir 'c:/2%20%3C%203'
.
Pour une utilisation dans des scripts / programmes qui doivent prendre en charge à la fois python 2 et 3, le module six fournit des fonctions de citation et d'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'
La syntaxe est la suivante:
import urllib3
urllib3.request.urlencode({"user" : "john" })
Une autre chose qui n'a peut-être pas déjà été mentionnée est que urllib.urlencode()
les valeurs vides dans le dictionnaire seront encodées en tant que chaîne None
au lieu d'avoir ce paramètre absent. Je ne sais pas si cela est généralement souhaité ou non, mais ne correspond pas à mon cas d'utilisation, donc je dois l'utiliser quote_plus
.
Pour Python 3 urllib3 fonctionne correctement, vous pouvez utiliser comme suit selon ses documents officiels :
import urllib3
http = urllib3.PoolManager()
response = http.request(
'GET',
'https://api.prylabs.net/eth/v1alpha1/beacon/attestations',
fields={ # here fields are the query params
'epoch': 1234,
'pageSize': pageSize
}
)
response = attestations.data.decode('UTF-8')