Après utilisation cgi.parse_qs()
, comment convertir le résultat (dictionnaire) en chaîne de requête? Vous cherchez quelque chose de similaire à urllib.urlencode()
.
Après utilisation cgi.parse_qs()
, comment convertir le résultat (dictionnaire) en chaîne de requête? Vous cherchez quelque chose de similaire à urllib.urlencode()
.
Réponses:
urllib.parse.
urlencode
(requête, doseq = Faux, [...])Convertissez un objet de mappage ou une séquence de tuples à deux éléments, qui peuvent contenir des objets str ou bytes, en une chaîne de texte ASCII codée en pourcentage.
A dict
est une cartographie.
urllib.urlencode
(query
[,doseq
])
Convertit un objet de mappage ou une séquence de tuples à deux éléments en une chaîne «encodée en pourcentage» ... une série dekey=value
paires séparées par des'&'
caractères ...
dict
renvoyé par a cgi.parse_qs()
en fait list
s comme "valeurs". En les transmettant directement, vous obtiendrez des chaînes de requête très étranges.
En python3, légèrement différent:
from urllib.parse import urlencode
urlencode({'pram1': 'foo', 'param2': 'bar'})
production: 'pram1=foo¶m2=bar'
pour la compatibilité python2 et python3, essayez ceci:
try:
#python2
from urllib import urlencode
except ImportError:
#python3
from urllib.parse import urlencode
Vous cherchez quelque chose exactement comme urllib.urlencode()
!
Cependant, lorsque vous appelez parse_qs()
(distinct de parse_qsl()
), les clés du dictionnaire sont les noms de variable de requête uniques et les valeurs sont des listes de valeurs pour chaque nom.
Afin de transmettre ces informations urllib.urlencode()
, vous devez "aplatir" ces listes. Voici comment vous pouvez le faire avec une liste de tuples:
query_pairs = [(k,v) for k,vlist in d.iteritems() for v in vlist]
urllib.urlencode(query_pairs)
doseq=True
.
Peut-être que vous cherchez quelque chose comme ça:
def dictToQuery(d):
query = ''
for key in d.keys():
query += str(key) + '=' + str(d[key]) + "&"
return query
Il prend un dictionnaire et le convertit en une chaîne de requête, tout comme urlencode. Il ajoutera un "&" final à la chaîne de requête, mais return query[:-1]
corrige cela, si c'est un problème.
str.join()
? Et pourquoi pas urllib.quote_plus()
?
urlencode
dans urllib.py
(cela devrait figurer dans votre installation Python) pour voir pourquoi la création d'une chaîne de requête n'est parfois pas aussi simple que votre réponse l'implique (en particulier la nécessité de `` citer '' certains caractères qui ne sont pas valides dans un URL). @Ignacio a également référencé deux fonctions qui nettoyeraient votre implémentation et la corrigeraient.
from urllib.parse import urlencode; urlencode(your_dict)
) est plus courte et plus facile que ça! J'admets qu'il est parfois judicieux de réinventer la roue, même de façon médiocre, quand il est coûteux ou peu pratique d'accéder à des roues existantes et bien conçues, mais ici, utiliser la roue du commerce est plus facile et plus rapide que de rouler la vôtre. .
cgi.parse_qs()
est obsolète. Utilisez plutôt urlparse.parse_qs ().