Python: Importando urllib.quote

109

Me gustaría usar urllib.quote(). Pero python (python3) no encuentra el módulo. Supongamos que tengo esta línea de código:

print(urllib.quote("châteu", safe=''))

¿Cómo importo urllib.quote?

import urllibo import urllib.quoteambos dan

AttributeError: 'module' object has no attribute 'quote'

Lo que me confunde es que urllib.requestse puede acceder a través deimport urllib.request

imrek
fuente

Respuestas:

180

En Python 3.x, necesita importar urllib.parse.quote:

>>> import urllib.parse
>>> urllib.parse.quote("châteu", safe='')
'ch%C3%A2teu'

Según la documentación del módulo Python 2.xurllib :

NOTA

El urllibmódulo se ha dividido en partes y se le ha cambiado el nombre en Python 3 a urllib.request , urllib.parsey urllib.error.

falsetru
fuente
54

Si necesita manejar Python 2.xy 3.x, puede detectar la excepción y cargar la alternativa.

try:
    from urllib import quote  # Python 2.X
except ImportError:
    from urllib.parse import quote  # Python 3+

También puede usar el contenedor de compatibilidad de Python seis para manejar esto.

from six.moves.urllib.parse import quote
eandersson
fuente
Debería mirar más hacia el futuro. Suponga python3 y excepto 2.7. intente: importar urllib.parse como urlparse excepto ImportError: from urlparse import urlparse # python 2.7.11
Lincoln Randall McFarland
@LincolnRandallMcFarland De lo que estás hablando es de una micro optimización tan irrelevante. No hace que sea más difícil o más fácil eliminar completamente el soporte de Python 2.X en el proyecto en el futuro.
eandersson
Si desea hacer que lanzar y capturar una excepción sea el proceso de importación estándar de su caso de uso más común solo porque ..., no hay ciclos fuera de mi reloj, pero sepa lo que está haciendo: las excepciones deben ser excepcionales. Es la diferencia entre hacerlo funcionar y hacerlo mejor.
Lincoln Randall McFarland
Esta es una discusión sin sentido. Ambos son válidos ... si detecta la excepción de Python 3, intente importar la biblioteca de Python 2.7, pero por alguna razón a ambos les falta la excepción lanzada dirá que falta la biblioteca de Python 2.7. Muy confuso. En realidad, si le importan tanto las excepciones, hay mejores formas de manejar esto, por ejemplo, seis o comprobar la versión de Python en lugar de confiar en una excepción. pero en realidad, si te importa tanto algo tan insignificante, no deberías mantener la compatibilidad con versiones anteriores de Python 2 porque de todos modos es EOL este año.
eandersson
14

urllib pasó por algunos cambios en Python3 y ahora se puede importar desde el submódulo parse

>>> from urllib.parse import quote  
>>> quote('"')                      
'%22'                               
Justin Fay
fuente
4

Así es como manejo esto, sin usar excepciones.

import sys
if sys.version_info.major > 2:  # Python 3 or later
    from urllib.parse import quote
else:  # Python 2
    from urllib import quote
Yutenji
fuente