Respuestas:
Debe pasar sus parámetros urlencode()
como una asignación (dict) o una secuencia de 2 tuplas, como:
>>> import urllib
>>> f = { 'eventName' : 'myEvent', 'eventDescription' : 'cool event'}
>>> urllib.urlencode(f)
'eventName=myEvent&eventDescription=cool+event'
Python 3 o superior
Utilizar:
>>> urllib.parse.urlencode(f)
eventName=myEvent&eventDescription=cool+event
Tenga en cuenta que esto no hace la codificación de URL en el sentido comúnmente utilizado (mire la salida). Para ese uso urllib.parse.quote_plus
.
Lo que estás buscando es 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, el urllib
paquete se ha dividido en componentes más pequeños. Usarás urllib.parse.quote_plus
(ten en cuenta el parse
módulo secundario)
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"
para un trazador de líneas en la línea de comando
¡Pruebe las solicitudes en lugar de urllib y no necesita molestarse con urlencode!
import requests
requests.get('http://youraddress.com', params=evt.fields)
EDITAR:
Si necesita pares ordenados de nombre-valor o valores múltiples para un nombre, configure los parámetros de la siguiente manera:
params=[('name1','value11'), ('name1','value12'), ('name2','value21'), ...]
en lugar de usar un diccionario.
La siguiente es una solución completa, que incluye cómo lidiar con algunas dificultades.
### ********************
## 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()
mí mismo ya que usa %20
más que +
.
Prueba esto:
urllib.pathname2url(stringToURLEncode)
urlencode
no funcionará porque solo funciona en diccionarios. quote_plus
no produjo la salida correcta.
my string
a my%20string
. ¡Su solución funciona de maravilla para eso!
%20
lugar de +
. Gracias
Tenga en cuenta que el urllib.urlencode no siempre funciona. El problema es que algunos servicios se preocupan por el orden de los argumentos, que se pierden al crear el diccionario. Para tales casos, urllib.quote_plus es mejor, como sugirió Ricky.
>>> import urllib >>> urllib.urlencode([('name', 'brandon'), ('uid', 1000)]) 'name=brandon&uid=1000'
para futuras referencias (ej .: para python3)
>>> import urllib.request as req
>>> query = 'eventName=theEvent&eventDescription=testDesc'
>>> req.pathname2url(query)
>>> 'eventName%3DtheEvent%26eventDescription%3DtestDesc'
'c:/2 < 3'
en Windows es '///C://2%20%3C%203'
. Quiero algo que solo salga 'c:/2%20%3C%203'
.
Para su uso en scripts / programas que necesitan ser compatibles con python 2 y 3, el módulo seis proporciona funciones de comillas y códigos de urlen:
>>> 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 sintaxis es la siguiente:
import urllib3
urllib3.request.urlencode({"user" : "john" })
Otra cosa que podría no haberse mencionado ya es que urllib.urlencode()
codificará valores vacíos en el diccionario como la cadena en None
lugar de tener ese parámetro como ausente. No sé si esto normalmente se desea o no, pero no se ajusta a mi caso de uso, por lo tanto, tengo que usarlo quote_plus
.
Para Python 3, urllib3 funciona correctamente, puede usar lo siguiente según sus documentos oficiales :
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')