Python: importando urllib.quote

110

Eu gostaria de usar urllib.quote(). Mas python (python3) não está encontrando o módulo. Suponha que eu tenha esta linha de código:

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

Como faço para importar urllib.quote?

import urllibou import urllib.quoteambos dão

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

O que me confunde é que urllib.requesté acessível viaimport urllib.request

imrek
fonte

Respostas:

180

No Python 3.x, você precisa importar urllib.parse.quote:

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

De acordo com a documentação do módulo Python 2.xurllib :

NOTA

O urllibmódulo tem sido dividida em partes e renomeado em Python 3 a urllib.request, urllib.parse, e urllib.error.

falsetru
fonte
54

Se você precisa lidar com Python 2.xe 3.x, você pode capturar a exceção e carregar a alternativa.

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

Você também pode usar o wrapper de compatibilidade seis do Python para lidar com isso.

from six.moves.urllib.parse import quote
eandersson
fonte
1
Você deve estar mais voltado para o futuro. Suponha python3 e exceto 2.7. try: import urllib.parse as urlparse exceto ImportError: from urlparse import urlparse # python 2.7.11
Lincoln Randall McFarland
@LincolnRandallMcFarland O que você está falando é uma micro otimização irrelevante. Não torna mais difícil ou fácil abandonar completamente o suporte Python 2.X no projeto no futuro.
eandersson
Se você deseja que o lançamento e a captura de uma exceção sejam o processo de importação padrão do seu caso de uso mais comum, só porque ..., não é um ciclo fora do meu relógio, mas saiba o que está fazendo: as exceções devem ser excepcionais. É a diferença entre fazer funcionar e melhorar.
Lincoln Randall McFarland
Esta é uma discussão tão sem sentido. Ambos são válidos ... se você capturar a exceção do Python 3, tente importar a biblioteca do Python 2.7, mas por alguma razão ambos estão perdendo a exceção lançada dirá que está faltando a biblioteca do Python 2.7. Muito confuso. Na realidade, se você se preocupa tanto com as exceções, existem maneiras melhores de lidar com isso, por exemplo, seis ou verificar a versão do Python em vez de confiar em uma exceção. mas, na realidade, se você se preocupa tanto com algo tão sem sentido, você não deveria manter a compatibilidade com versões anteriores do Python 2 porque, de qualquer forma, é EOL este ano.
eandersson
14

urllib passou por algumas mudanças no Python3 e agora pode ser importado do submódulo parse

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

É assim que eu lido com isso, sem usar exceções.

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
fonte