libreria - ¿Cómo codificar en porcentaje los parámetros de URL en Python?
urllib python 3 (4)
Si lo hago
url = "http://example.com?p=" + urllib.quote(query)
- No codifica
/
a%2F
(rompe la normalización de OAuth) - No maneja Unicode (lanza una excepción)
¿Hay una mejor biblioteca?
De la docs :
urllib.quote(string[, safe])
Reemplace los caracteres especiales en la cadena usando el escape% xx. 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 la URL. El parámetro seguro opcional especifica caracteres adicionales que no deben citarse; su valor predeterminado es ''/''
Eso significa que aprobar "por seguridad resolverá su primer problema:
>>> urllib.quote(''/test'')
''/test''
>>> urllib.quote(''/test'', safe='''')
''%2Ftest''
Sobre el segundo tema, hay un informe de error al respecto here . Aparentemente se solucionó en Python 3. Puedes solucionarlo codificando como utf8 de esta manera:
>>> query = urllib.quote(u"Müller".encode(''utf8''))
>>> print urllib.unquote(query).decode(''utf8'')
Müller
Por cierto echar un vistazo a urlencode
Tenga en cuenta que urllib.quote
movió a urllib.parse.quote
en Python3
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/''
Mi respuesta es similar a la de Paolo.
Creo que las requests
módulos son mucho mejores. Está basado en urllib3
. Puedes probar esto:
>>> from requests.utils import quote
>>> quote(''/test'')
''/test''
>>> quote(''/test'', safe='''')
''%2Ftest''
Si estás usando django, puedes usar urlquote:
>>> from django.utils.http import urlquote
>>> urlquote(u"Müller")
u''M%C3%BCller''
Tenga en cuenta que los cambios en Python desde que se publicó esta respuesta significan que ahora es un contenedor heredado. Desde el código fuente de Django 2.1 para django.utils.http:
A legacy compatibility wrapper to Python''s urllib.parse.quote() function. (was used for unicode handling on Python 2)