Python: importation de urllib.quote

110

Je voudrais utiliser urllib.quote(). Mais python (python3) ne trouve pas le module. Supposons que j'ai cette ligne de code:

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

Comment importer urllib.quote?

import urllibou les import urllib.quotedeux donnent

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

Ce qui me trouble, c'est qu'il urllib.requestest accessible viaimport urllib.request

Imrek
la source

Réponses:

180

Dans Python 3.x, vous devez importer urllib.parse.quote:

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

Selon la documentation du module Python 2.xurllib :

REMARQUE

Le urllibmodule a été divisé en parties et renommé dans le python 3 à urllib.request, urllib.parseet urllib.error.

falsetru
la source
54

Si vous avez besoin de gérer à la fois Python 2.x et 3.x, vous pouvez intercepter l'exception et charger l'alternative.

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

Vous pouvez également utiliser le wrapper de compatibilité python six pour gérer cela.

from six.moves.urllib.parse import quote
eandersson
la source
1
Vous devriez être plus tourné vers l'avenir. Supposons python3 et sauf 2.7. try: import urllib.parse as urlparse sauf ImportError: from urlparse import urlparse # python 2.7.11
Lincoln Randall McFarland
@LincolnRandallMcFarland Ce dont vous parlez est une micro-optimisation tellement hors de propos. Il n'est pas plus difficile ni plus facile de supprimer complètement la prise en charge de Python 2.X dans le projet à l'avenir.
eandersson
Si vous voulez faire de lancer et attraper une exception le processus d'importation standard de votre cas d'utilisation le plus courant simplement parce que ..., ce n'est pas un cycle hors de mon horloge, mais sachez ce que vous faites: les exceptions devraient être exceptionnelles. C'est la différence entre le faire fonctionner et le rendre meilleur.
Lincoln Randall McFarland le
C'est une discussion tellement dénuée de sens. Les deux sont valides ... si vous attrapez l'exception Python 3, essayez d'importer la bibliothèque Python 2.7, mais pour une raison quelconque, les deux manquent l'exception lancée dira qu'il manque la bibliothèque Python 2.7. Très perturbant. En réalité, si vous vous souciez autant des exceptions, il existe de meilleures façons de gérer cela, par exemple six ou vérifier la version Python au lieu de compter sur une exception. mais en réalité, si vous vous souciez autant de quelque chose d'aussi insignifiant, vous ne devriez pas du tout garder la rétrocompatibilité de Python 2 parce que c'est EOL cette année de toute façon.
eandersson le
14

urllib a subi quelques modifications dans Python3 et peut maintenant être importé depuis le sous-module d'analyse

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

C'est ainsi que je gère cela, sans utiliser d'exceptions.

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
la source