unquote libreria python url encoding urllib urlencode

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)

  1. No codifica / a %2F (rompe la normalización de OAuth)
  2. 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)