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 à la citation de la section de chemin de l'URL. Le paramètre optionnel sûr spécifie des caractères supplémentaires qui ne doivent pas être cités - sa valeur par défaut est '/'
Cela signifie que le fait de passer '' en toute sécurité résoudra votre premier problème:
À propos du deuxième problème, il y a un rapport de bogue à ce sujet ici . Apparemment, il a été corrigé en python 3. Vous pouvez le contourner en encodant en utf8 comme ceci:
Merci, les deux ont très bien fonctionné. urlencode appelle simplement quoteplus plusieurs fois dans une boucle, ce qui n'est pas la normalisation correcte pour ma tâche (oauth).
Paul Tarjan
6
la spécification: rfc 2396 les définit comme réservés. reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","C'est à cela que traite urllib.quote.
Jeff Sheffield
63
urllib.quotedéplacé vers urlib.parse.quote, depuis Python3.
De plus, dans le cas de l'encodage d'une requête de recherche, il vaut peut-être mieux utiliser quote_plus: docs.python.org/3/library/… 1. Il encode les barres obliques par défaut 2. Il encode également les espaces
Le nom quoteest plutôt vague en tant que global. Il pourrait être plus agréable d'utiliser quelque chose comme urlencode: from urllib.parse import quote as urlencode.
Luc
Notez qu'il ya une fonction nommée urlencodedans urllib.parsedéjà fait quelque chose de complètement différent, vous feriez mieux de choisir un autre nom ou un risque de confusion au sérieux les lecteurs futurs de votre code.
jaymmer
48
Ma réponse est similaire à la réponse de Paolo.
Je pense que le module requestsest beaucoup mieux. C'est basé sur urllib3. Vous pouvez essayer ceci:
Notez que les modifications apportées à Python depuis la publication de cette réponse signifient qu'il s'agit désormais d'un wrapper hérité. Du code source de 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 vaut mieux l'utiliser urlencodeici. Pas beaucoup de différence pour un seul paramètre mais à mon humble avis, le code est plus clair. (Cela semble déroutant de voir une fonction quote_plus! En particulier ceux provenant d'autres langueurs)
Réponses:
Python 2
De la documentation :
Cela signifie que le fait de passer '' en toute sécurité résoudra votre premier problème:
À propos du deuxième problème, il y a un rapport de bogue à ce sujet ici . Apparemment, il a été corrigé en python 3. Vous pouvez le contourner en encodant en utf8 comme ceci:
Au fait, jetez un oeil à urlencode
Python 3
La même chose, sauf remplacer
urllib.quote
parurllib.parse.quote
.la source
reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
C'est à cela que traite urllib.quote.urllib.quote
déplacé versurlib.parse.quote
, depuis Python3.urllib.parse.quote
docsEn Python 3,
urllib.quote
a été déplacé versurllib.parse.quote
et il gère unicode par défaut.la source
quote
est plutôt vague en tant que global. Il pourrait être plus agréable d'utiliser quelque chose comme urlencode:from urllib.parse import quote as urlencode
.urlencode
dansurllib.parse
déjà fait quelque chose de complètement différent, vous feriez mieux de choisir un autre nom ou un risque de confusion au sérieux les lecteurs futurs de votre code.Ma réponse est similaire à la réponse de Paolo.
Je pense que le module
requests
est beaucoup mieux. C'est basé sururllib3
. Vous pouvez essayer ceci:la source
requests.utils.quote
est un lien vers pythonquote
. Voir les sources de demande .requests.utils.quote
est un wrapper de compatibilité minceurllib.quote
pour python 2 eturllib.parse.quote
pour python 3Si vous utilisez django, vous pouvez utiliser urlquote:
Notez que les modifications apportées à Python depuis la publication de cette réponse signifient qu'il s'agit désormais d'un wrapper hérité. Du code source de Django 2.1 pour django.utils.http:
la source
Il vaut mieux l'utiliser
urlencode
ici. Pas beaucoup de différence pour un seul paramètre mais à mon humble avis, le code est plus clair. (Cela semble déroutant de voir une fonctionquote_plus
! En particulier ceux provenant d'autres langueurs)Documents
urlencode: https://docs.python.org/3/library/urllib.parse.html#urllib.parse.urlencode
quote_plus: https://docs.python.org/3/library/urllib.parse.html#urllib.parse.quote_plus
la source