Codificación de URL en Python

¿Hay un método simple que me falta en urllib u otra biblioteca para esta tarea? La encoding de URL reemplaza los caracteres ASCII inseguros con un “%” seguido de dos dígitos hexadecimales.

Aquí hay un ejemplo de una entrada y mi salida esperada:

 Mozilla/5.0 (Linux; U; Android 4.0; xx-xx; Galaxy Nexus Build/IFL10C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 Mozilla%2F5.0+%28Linux%3B+U%3B+Android+4.0%3B+xx-xx%3B+Galaxy+Nexus+Build%2FIFL10C%29+AppleWebKit%2F534.30+%28KHTML%2C+like+Gecko%29+Version%2F4.0+Mobile+Safari%2F534.30 

Para Python 2.x, use urllib.quote

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 se deben citar, su valor predeterminado es ‘/’.

ejemplo:

 In [1]: import urllib In [2]: urllib.quote('%') Out[2]: '%25' 

EDITAR :

En su caso, para reemplazar el espacio por signos más, puede usar urllib.quote_plus

ejemplo:

 In [4]: urllib.quote_plus('a b') Out[4]: 'a+b' 

Para Python 3.x, usa quote

 >>> import urllib >>> a = "asdas#@das" >>> urllib.parse.quote(a) 'asdas%23%40das' 

y para cadena con espacio use quote_plus

 >>> import urllib >>> a = "as da& s#@das" >>> urllib.parse.quote_plus(a) 'as+da%26+s%23%40das' 

Tenga en cuenta que tanto urllib.quote como urllib.quote_plus arrojan un error si una entrada es una cadena Unicode:

 s = u'\u2013' urllib.quote(s) Traceback (most recent call last): File "", line 1, in  File "C:\Python27\lib\urllib.py", line 1303, in quote return ''.join(map(quoter, s)) KeyError: u'\u2013' 

Como se responde aquí en SO , uno tiene que usar ‘UTF-8’ explícitamente:

 urllib.quote(s.encode('utf-8')) 

Además, si tiene un dict de varios valores, la mejor manera de hacerlo será urllib.urlencode .