uso urllib.quote
o urllib.quote_plus
Desde el urllib documentation:
cotización (cadena [, salvo])
reemplazar caracteres especiales en la cadena usando el escape "% xx". Las letras, dígitos, y los caracteres "_.-" son nunca citados. El parámetro seguro opcional especifica caracteres adicionales que no se deben citar - su valor predeterminado es '/'.
Ejemplo: quote('/~connolly/')
produce '/%7econnolly/'
.
quote_plus (cadena [, salvo])
, como la cita(), pero también reemplaza espacios por signos de suma, como se requiere para citar valores del formulario HTML. Los signos más en la cadena original se escapan a menos que estén incluidos en la caja fuerte. También no tiene el valor predeterminado seguro para '/'.
EDIT: Usando urllib.quote o urllib.quote_plus en toda la URL mangle, como @ ΤΖΩΤΖΙΟΥ señala:
>>> quoted_url = urllib.quote('http://www.example.com/foo goo/bar.html')
>>> quoted_url
'http%3A//www.example.com/foo%20goo/bar.html'
>>> urllib2.urlopen(quoted_url)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "c:\python25\lib\urllib2.py", line 124, in urlopen
return _opener.open(url, data)
File "c:\python25\lib\urllib2.py", line 373, in open
protocol = req.get_type()
File "c:\python25\lib\urllib2.py", line 244, in get_type
raise ValueError, "unknown url type: %s" % self.__original
ValueError: unknown url type: http%3A//www.example.com/foo%20goo/bar.html
@ ΤΖΩΤΖΙΟΥ proporciona una función que utiliza urlparse.urlparse and urlparse.urlunparse para analizar la URL y solo codifica la ruta. Esto puede ser más útil para usted, aunque si está construyendo la URL de un protocolo y host conocido pero con una ruta sospechosa, probablemente podría hacer lo mismo para evitar urlparse y simplemente citar la parte sospechosa de la URL, concatenando con partes seguras conocidas.
Hay una respuesta más arriba-hasta la fecha en StackOverflow aquí: http://stackoverflow.com/questions/10584861/canonize-normali ze-an-url-in-python/15629657 – stuckintheshuck
No creo que sea mejor ... –