2009-11-08 18 views

Répondre

282

De l'docs:

urllib.quote(string[, safe]) 

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

Ce signifie passer « » pour la sécurité résoudra 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 here. Apparemment, il a été fixé en python 3. Vous pouvez contourner par le 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

Notez que urllib.quote déplacé à urllib.parse.quote dans python3

+0

Merci vous, tous les deux fonctionnait très bien. urlencode appelle simplement plusieurs fois quoteplus dans une boucle, ce qui n'est pas la normalisation correcte pour ma tâche (oauth). –

+4

la spécification: [rfc 2396] (https://www.ietf.org/rfc/rfc2396.txt) définit ceux-ci comme réservés 'reserved ="; " | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | "," 'Ce qui est traité par urllib.quote. –

+25

'urllib.quote' a été déplacé dans' urlib.parse.quote', depuis Python3. – Hibou57

107

En Python 3, urllib.quote a été déplacé vers 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/' 
29

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' 
+2

' requests.utils.quote' est un lien vers python 'citation '. Voir [request sources] (https: // github.com/kennethreitz/requests/blob/maître/requests/compat.py # L36). – Cjkjvfnby

+8

'requests.utils.quote' est un wrapper de compatibilité mince avec' urllib.quote' pour python 2 et 'urllib.parse.quote' pour python 3 –

8

Si vous utilisez django, vous pouvez utiliser urlquote:

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