¿Cómo puedo codificar porcentualmente los parámetros de URL en Python?
Si lo hago
url = "http://example.com?p=" + urllib.quote(query)
- No codifica
/
(%2F
rompe la normalización de OAuth) - No maneja Unicode (lanza una excepción)
¿Existe una biblioteca mejor?
De la documentación de Python 3 :
urllib.parse.quote(string, safe='/', encoding=None, errors=None)
Reemplace los caracteres especiales en la cadena usando el
%xx
escape. Las letras, los dígitos y los caracteres'_.-~'
nunca se citan. De forma predeterminada, esta función está destinada a citar la sección de ruta de una URL. El parámetro seguro opcional especifica caracteres ASCII adicionales que no deben citarse; su valor predeterminado es'/'
.
Eso significa que pasar ''
por seguro resolverá su primer problema:
>>> import urllib.parse
>>> urllib.parse.quote('/test')
'/test'
>>> urllib.parse.quote('/test', safe='')
'%2Ftest'
(La función quote
se movió de urllib
a urllib.parse
en Python 3).
Por cierto, echa un vistazo a urlencode .
Sobre el segundo problema, hubo un informe de error al respecto y se solucionó en Python 3.
Para Python 2, puedes solucionarlo codificando como UTF-8 de esta manera:
>>> query = urllib.quote(u"Müller".encode('utf8'))
>>> print urllib.unquote(query).decode('utf8')
Müller
En Python 3, urllib.quote
se ha movido a urllib.parse.quote
y maneja Unicode de forma predeterminada.
>>> from urllib.parse import quote
>>> quote('/test')
'/test'
>>> quote('/test', safe='')
'%2Ftest'
>>> quote('/El Niño/')
'/El%20Ni%C3%B1o/'
Creo que el módulo requests
es mucho mejor. Está basado en urllib3
.
Puedes probar esto:
>>> from requests.utils import quote
>>> quote('/test')
'/test'
>>> quote('/test', safe='')
'%2Ftest'
Mi respuesta es similar a la respuesta de Paolo .