Si hagoCómo codificar por ciento los parámetros de URL en Python?
url = "http://example.com?p=" + urllib.quote(query)
- Es no codifica
/
a%2F
(rompe la normalización de OAuth) - No maneja Unicode (lanza una excepción)
¿Hay una mejor biblioteca?
Si hagoCómo codificar por ciento los parámetros de URL en Python?
url = "http://example.com?p=" + urllib.quote(query)
/
a %2F
(rompe la normalización de OAuth)¿Hay una mejor biblioteca?
Desde el docs:
urllib.quote(string[, safe])
reemplazar caracteres especiales en la cadena usando el escape xx%. Las letras, los dígitos, y los caracteres '_.-' nunca son cotizados. Por defecto, esta función está destinada a citando la sección de trayectoria del parámetro de seguridad opcional URL.The especifica caracteres adicionales que no debe ser citada - su valor por defecto es '/'
Eso significa pasar '' de seguro va a resolver su primer número:
>>> urllib.quote('/test')
'/test'
>>> urllib.quote('/test', safe='')
'%2Ftest'
sobre la segunda cuestión, hay un informe de fallo al respecto here. Al parecer, se fijó en Python 3. Puede solucionar por la codificación UTF-8 como la siguiente:
>>> 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
trasladó a urllib.parse.quote
en python3
En Python 3, urllib.quote
se ha movido a urllib.parse.quote
y maneja Unicode por defecto.
>>> 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 respuesta de Paolo.
Creo que el módulo requests
es mucho mejor. Se basa en urllib3
. Puede probar esto:
>>> from requests.utils import quote
>>> quote('/test')
'/test'
>>> quote('/test', safe='')
'%2Ftest'
' requests.utils.quote' es un enlace a la cita de python ' '. Ver [fuentes de solicitud] (https: // github.com/kennethreitz/requests/blob/master/requests/compat.py # L36). – Cjkjvfnby
'requests.utils.quote' es un contenedor de compatibilidad delgado para' urllib.quote' para python 2 y 'urllib.parse.quote' para python 3 –
Si está usando Django, puede utilizar urlquote:
>>> from django.utils.http import urlquote
>>> urlquote(u"Müller")
u'M%C3%BCller'
Gracias usted, ambos trabajaron muy bien. urlencode solo llama a quoteplus muchas veces en un bucle, que no es la normalización correcta para mi tarea (oauth). –
la especificación: [rfc 2396] (https://www.ietf.org/rfc/rfc2396.txt) las define como reservadas 'reserved ='; " | "/" | "¿?" | ":" | "@" | "&" | "=" | "+" | "$" | "," 'Que es lo que urllib.quote está tratando. –
'urllib.quote' movido a' urlib.parse.quote', desde Python3. – Hibou57