Comment encoder en pourcentage les parameters d’URL en Python?

Si je fais

url = "http://example.com?p=" + urllib.quote(query) 
  1. Il n’encode pas / à %2F (rompt la normalisation OAuth)
  2. Il ne gère pas Unicode (il lève une exception)

Y a-t-il une meilleure bibliothèque?

    De la documentation :

     urllib.quote(ssortingng[, safe]) 

    Remplacez les caractères spéciaux dans la chaîne à l’aide de l’échappement% xx. Les lettres, les chiffres et les caractères ‘_.-‘ ne sont jamais cités. Par défaut, cette fonction est destinée à citer la section chemin de l’URL. Le paramètre facultatif safe spécifie des caractères supplémentaires à ne pas citer – sa valeur par défaut est ‘/’

    Cela signifie que le fait de passer «pour la sécurité» résoudra votre premier problème:

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

    A propos du deuxième problème, il y a un rapport de bogue à ce sujet ici . Apparemment, il a été corrigé dans python 3. Vous pouvez le contourner en encodant comme suit:

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

    Soit dit en passant, urlencode

    Notez que urllib.quote déplacé dans urllib.parse.quote dans Python3

    Dans Python 3, urllib.quote a été déplacé dans urllib.parse.quote et il 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 les requests modules sont bien meilleures. C’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'