Comment convertir un dictionnaire en chaîne de requête en Python?
114
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().
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.
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 de key=valuepaires séparées par des '&'caractères ...
C'est vrai, mais le dictrenvoyé par a cgi.parse_qs()en fait lists comme "valeurs". En les transmettant directement, vous obtiendrez des chaînes de requête très étranges.
Johnsyweb
Assez vrai. Cela m'apprendra à lire plus que la première phrase!
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)
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.
Avez-vous déjà rencontré str.join()? Et pourquoi pas urllib.quote_plus()?
Ignacio Vazquez-Abrams
1
@garbados Votre solution devrait fonctionner dans des cas simples. Cependant, jetez un œil urlencodedans 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.
Anthony Cramp
Ah, en effet. Désolé pour la mise en œuvre grossière. Cela montre que je devrais être plus prudent en répondant à des questions auxquelles je ne me suis jamais posé.
garbados
Bien que ce ne soit peut-être pas la meilleure réponse, c'est exactement ce que je voulais voir lorsque j'ai cliqué sur le titre de cette question. Je n'ai que 4 éléments dans un dict que je dois transformer en une paire nom = valeur séparée par un «&». Mes valeurs sont contrôlées. Le str.join () est pratique dans mon cas mais je n'ai pas besoin de quote_plus (), encore une fois, car ce n'est pas du code public :) Merci!
harperville
1
@harperville mais la manière la plus correcte ( 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 ().Réponses:
Python 3
A
dict
est une cartographie.Python hérité
la source
dict
renvoyé par acgi.parse_qs()
en faitlist
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:
production:
'pram1=foo¶m2=bar'
pour la compatibilité python2 et python3, essayez ceci:
la source
Vous cherchez quelque chose exactement comme
urllib.urlencode()
!Cependant, lorsque vous appelez
parse_qs()
(distinct deparse_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:la source
doseq=True
.Peut-être que vous cherchez quelque chose comme ça:
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.la source
str.join()
? Et pourquoi pasurllib.quote_plus()
?urlencode
dansurllib.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. .