2012-01-18 28 views
20

¿Existe un método simple que me falta en urllib u otra biblioteca para esta tarea? La codificación URL reemplaza los caracteres ASCII inseguros con un "%" seguido de dos dígitos hexadecimales.Codificación URL en python

He aquí 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 

Respuesta

41

Para Python 2.x, utilice urllib.quote

reemplazar caracteres especiales en la cadena utilizando el escape xx%. Las letras, los dígitos y los caracteres '_.-' nunca se citan. Por defecto, esta función está destinada a citar la sección de ruta de la URL. El parámetro de seguridad 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, con el fin de sustituir el espacio por signos de suma, es posible utilizar urllib.quote_plus

ejemplo:

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

Para Python 3.x, utilice quote

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

y para la cadena con el uso del espacio 'quote_plus'

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

o [urllib.quote_plus] (http://docs.python.org/library/urllib.html#urllib.quote_plus), ya que OP quiere '+' en lugar de '% 20'. – Avaris

+2

pero para obtener lo que solicita el OP, use 'urllib.quote_plus'. –

1

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

2

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

s = u'\u2013' 
urllib.quote(s) 

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

como respondida here on SO, uno tiene que usar 'UTF-8' de forma explícita:

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