Question

Si je fais

url = "http://example.com?p=" + urllib.quote(query)
  1. Il ne code pas pour / à %2F (pauses normalisation OAuth)
  2. Il ne gère pas Unicode (il renvoie une exception)

Y at-il une meilleure bibliothèque?

Était-ce utile?

La solution

De la docs :

urllib.quote(string[, safe])
  

Remplacer des caractères spéciaux dans la chaîne   en utilisant l'évasion% xx. Lettres, chiffres,   et les caractères « _.- » ne sont jamais   cité. Par défaut, cette fonction est   destiné à citer la section de trajet   du paramètre sécurité URL.The en option   spécifie des caractères supplémentaires   ne doit pas être cité - sa valeur par défaut   La valeur est '/'

Cela signifie passer « » pour la sécurité va résoudre votre premier numéro:

>>> urllib.quote('/test')
'/test'
>>> urllib.quote('/test', safe='')
'%2Ftest'

A propos de la deuxième question, il y a un rapport de bogue à ce sujet . Apparemment, il a été fixé en python 3. Vous pouvez contourner par codage UTF8 comme ceci:

>>> query = urllib.quote(u"Müller".encode('utf8'))
>>> print urllib.unquote(query).decode('utf8')
Müller

D'ailleurs un coup d'oeil à urlencode

Remarque urllib.quote déplacé à urllib.parse.quote dans python3

Autres conseils

python 3, urllib.quote a été déplacé à < a href = "http://docs.python.org/3/library/urllib.parse.html#urllib.parse.quote" rel = "noreferrer"> urllib.parse.quote et ne gère unicode par défaut.

>>> from urllib.parse import quote
>>> quote('/test')
'/test'
>>> quote('/test', safe='')
'%2Ftest'
>>> quote('/El Niño/')
'/El%20Ni%C3%B1o/'

Ma réponse est similaire à la réponse de Paolo.

Je pense que le module requests est beaucoup mieux. Il est basé sur urllib3. Vous pouvez essayer ceci:

>>> from requests.utils import quote
>>> quote('/test')
'/test'
>>> quote('/test', safe='')
'%2Ftest'

Si vous utilisez django, vous pouvez utiliser urlquote:

>>> from django.utils.http import urlquote
>>> urlquote(u"Müller")
u'M%C3%BCller'

Notez que les changements Python depuis cette réponse a été publiée moyenne que c'est maintenant une enveloppe héritée. À partir du code source Django 2.1 pour django.utils.http:

A legacy compatibility wrapper to Python's urllib.parse.quote() function.
(was used for unicode handling on Python 2)

Il est préférable d'utiliser urlencode ici. Pas beaucoup de différence pour un seul paramètre, mais rend le code plus clair à mon humble avis. (Il semble déroutant de voir une quote_plus fonction! En particulier ceux qui viennent d'autres languates)

In [21]: query='lskdfj/sdfkjdf/ksdfj skfj'

In [22]: val=34

In [23]: from urllib.parse import urlencode

In [24]: encoded = urlencode(dict(p=query,val=val))

In [25]: print(f"http://example.com?{encoded}")
http://example.com?p=lskdfj%2Fsdfkjdf%2Fksdfj+skfj&val=34

Docs

urlencode: https: //docs.python .org / 3 / bibliothèque / urllib.parse.html # urllib.parse.urlencode

quote_plus: https: //docs.python .org / 3 / bibliothèque / urllib.parse.html # urllib.parse.quote_plus

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top