¿Cómo puedo codificar porcentualmente los parámetros de URL en Python?

Resuelto Paul Tarjan asked hace 14 años • 6 respuestas

Si lo hago

url = "http://example.com?p=" + urllib.quote(query)
  1. No codifica /( %2Frompe la normalización de OAuth)
  2. No maneja Unicode (lanza una excepción)

¿Existe una biblioteca mejor?

Paul Tarjan avatar Nov 08 '09 09:11 Paul Tarjan
Aceptado

De la documentación de Python 3 :

urllib.parse.quote(string, safe='/', encoding=None, errors=None)

Reemplace los caracteres especiales en la cadena usando el %xxescape. 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 una URL. El parámetro seguro opcional especifica caracteres ASCII adicionales que no deben citarse; su valor predeterminado es'/' .

Eso significa que pasar ''por seguro resolverá su primer problema:

>>> import urllib.parse
>>> urllib.parse.quote('/test')
'/test'
>>> urllib.parse.quote('/test', safe='')
'%2Ftest'

(La función quotese movió de urlliba urllib.parseen Python 3).

Por cierto, echa un vistazo a urlencode .


Sobre el segundo problema, hubo un informe de error al respecto y se solucionó en Python 3.

Para Python 2, puedes solucionarlo codificando como UTF-8 de esta manera:

>>> query = urllib.quote(u"Müller".encode('utf8'))
>>> print urllib.unquote(query).decode('utf8')
Müller
Nadia Alramli avatar Nov 08 '2009 02:11 Nadia Alramli

En Python 3, urllib.quotese ha movido a urllib.parse.quotey 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/'
Paolo Moretti avatar Nov 29 '2012 11:11 Paolo Moretti

Creo que el módulo requestses mucho mejor. Está basado en urllib3.

Puedes probar esto:

>>> from requests.utils import quote
>>> quote('/test')
'/test'
>>> quote('/test', safe='')
'%2Ftest'

Mi respuesta es similar a la respuesta de Paolo .

Aminah Nuraini avatar Jul 14 '2015 08:07 Aminah Nuraini