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 deben citarse; su valor predeterminado es '/'
Eso significa que pasar '' por seguro resolverá su primer problema:
Sobre el segundo problema, hay un informe de error al respecto aquí . Aparentemente se solucionó en Python 3. Puede solucionarlo codificando como utf8 de esta manera:
Gracias, ambos funcionaron muy bien. urlencode simplemente llama a quoteplus muchas veces en un bucle, que no es la normalización correcta para mi tarea (oauth).
Paul Tarjan
66
la especificación: rfc 2396 los define como reservados, reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","que es lo que trata urllib.quote.
Jeff Sheffield
63
urllib.quotemovido a urlib.parse.quote, desde Python3.
Además, en el caso de codificar una consulta de búsqueda, quizás sea mejor usar quote_plus: docs.python.org/3/library/… 1. Codifica barras por defecto 2. También codifica espacios
El nombre quotees bastante vago como global. Puede ser que sea más agradable de usar algo como urlencode: from urllib.parse import quote as urlencode.
Luc
Tenga en cuenta que hay una función llamada urlencodeen urllib.parseya que hace algo completamente diferente, por lo que sería mejor escoger otro nombre o el riesgo de confundir seriamente los futuros lectores de su código.
jaymmer - Restablece a Mónica el
48
Mi respuesta es similar a la respuesta de Paolo.
Creo que el módulo requestses mucho mejor. Se basa en urllib3. Puedes probar esto:
Tenga en cuenta que los cambios en Python desde que se publicó esta respuesta significa que ahora es un contenedor heredado. Del código fuente de Django 2.1 para django.utils.http:
A legacy compatibility wrapper to Python's urllib.parse.quote() function.
(was used for unicode handling on Python 2)
Es mejor usar urlencodeaquí. No hay mucha diferencia para un solo parámetro, pero en mi humilde opinión, el código es más claro. (¡Parece confuso ver una función quote_plus! Especialmente las que provienen de otros idiomas)
Respuestas:
Python 2
De los documentos :
Eso significa que pasar '' por seguro resolverá su primer problema:
Sobre el segundo problema, hay un informe de error al respecto aquí . Aparentemente se solucionó en Python 3. Puede solucionarlo codificando como utf8 de esta manera:
Por cierto, eche un vistazo a urlencode
Python 3
Lo mismo, excepto reemplazar
urllib.quote
conurllib.parse.quote
.fuente
reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
que es lo que trata urllib.quote.urllib.quote
movido aurlib.parse.quote
, desde Python3.urllib.parse.quote
docsEn Python 3,
urllib.quote
se ha movidourllib.parse.quote
y maneja unicode de manera predeterminada.fuente
quote
es bastante vago como global. Puede ser que sea más agradable de usar algo como urlencode:from urllib.parse import quote as urlencode
.urlencode
enurllib.parse
ya que hace algo completamente diferente, por lo que sería mejor escoger otro nombre o el riesgo de confundir seriamente los futuros lectores de su código.Mi respuesta es similar a la respuesta de Paolo.
Creo que el módulo
requests
es mucho mejor. Se basa enurllib3
. Puedes probar esto:fuente
requests.utils.quote
es un enlace a pythonquote
. Ver fuentes de solicitud .requests.utils.quote
es un envoltorio de compatibilidad delgadourllib.quote
para Python 2 yurllib.parse.quote
Python 3Si está usando django, puede usar urlquote:
Tenga en cuenta que los cambios en Python desde que se publicó esta respuesta significa que ahora es un contenedor heredado. Del código fuente de Django 2.1 para django.utils.http:
fuente
Es mejor usar
urlencode
aquí. No hay mucha diferencia para un solo parámetro, pero en mi humilde opinión, el código es más claro. (¡Parece confuso ver una funciónquote_plus
! Especialmente las que provienen de otros idiomas)Docs
urlencode: https://docs.python.org/3/library/urllib.parse.html#urllib.parse.urlencode
quote_plus: https://docs.python.org/3/library/urllib.parse.html#urllib.parse.quote_plus
fuente