Après l'utilisation de cgi.parse_qs()
, comment convertir le résultat (dictionnaire) retour à la chaîne de requête? À la recherche de quelque chose de similaire urllib.urlencode()
.
Réponses
Trop de publicités?À partir de la documentation:
urllib.urlencode
(query
[,doseq
])
Convertir un objet de mappage ou une séquence de deux éléments de n-uplets pour un "pour-cent-codé" chaîne... une série d'key=value
paires séparées par'&'
personnages...
Un dict
est un mappage.
Vous êtes à la recherche de quelque chose exactement comme urllib.urlencode()
!
Toutefois, lorsque vous appelez parse_qs()
(distincte parse_qsl()
), le dictionnaire clés sont l'unique requête des noms de variables et les valeurs sont des listes de valeurs pour chaque nom.
Pour transmettre cette information en urllib.urlencode()
, vous devez "aplatir", ces listes. Voici comment vous pouvez le faire avec une liste comprehenshion de tuples:
query_pairs = [(k,v) for k,vlist in d.iteritems() for v in vlist]
urllib.urlencode(query_pairs)
Peut-être vous cherchez quelque chose comme ceci:
def dictToQuery(d):
query = ''
for key in d.keys():
query += str(key) + '=' + str(d[key]) + "&"
return query
Il prend un dictionnaire et de le convertir en une chaîne de requête, tout comme la fonction urlencode. Il va ajouter un final "&" à la chaîne de requête, mais return query[:-1]
correctifs, si c'est un problème.
Un liner:
'&'.join([str(q) + '=' + str(d[q]) for q in d])
Edit: explication: par exemple: d = {'a': 1, 'b': 2 }
[str(q) + '=' + str(d[q]) for q in d]
On itère sur les éléments (variable q) dans le dict d et nous concaténer la clé avec '=' et la valeur. Il nous donne un tableau comme ['a=1, b=2'].
'&'.join(['a=1', 'b=2'])
Nous venons de joindre les éléments de la matrice, ce qui donne 'a=1&b=2'.