Comment pour cent encoder des paramètres d'URL en Python?
Question
Si je fais
url = "http://example.com?p=" + urllib.quote(query)
- Il ne code pas pour
/
à%2F
(pauses normalisation OAuth) - Il ne gère pas Unicode (il renvoie une exception)
Y at-il une meilleure bibliothèque?
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