Как после использования cgi.parse_qs()
преобразовать результат (словарь) обратно в строку запроса? Ищу что-то похожее на urllib.urlencode()
.
Как после использования cgi.parse_qs()
преобразовать результат (словарь) обратно в строку запроса? Ищу что-то похожее на urllib.urlencode()
.
Ответы:
urllib.parse.
urlencode
(запрос, доза = ложь, [...])Преобразуйте объект сопоставления или последовательность двухэлементных кортежей, которые могут содержать объекты str или bytes, в текстовую строку ASCII с процентной кодировкой.
A dict
- отображение.
urllib.urlencode
(query
[,doseq
])
Преобразование объекта сопоставления или последовательности двухэлементных кортежей в строку «с процентным кодированием» ... сериюkey=value
пар, разделенных'&'
символами ...
dict
возвращается s. Их прямая передача приведет к очень странному виду строк запроса. cgi.parse_qs()
list
В python3 немного по-другому:
from urllib.parse import urlencode
urlencode({'pram1': 'foo', 'param2': 'bar'})
вывод: 'pram1=foo¶m2=bar'
для совместимости с python2 и python3 попробуйте следующее:
try:
#python2
from urllib import urlencode
except ImportError:
#python3
from urllib.parse import urlencode
Вы ищете что - то точно , как urllib.urlencode()
!
Однако при вызове parse_qs()
(отличном от parse_qsl()
) ключи словаря представляют собой уникальные имена переменных запроса, а значения представляют собой списки значений для каждого имени.
Чтобы передать эту информацию urllib.urlencode()
, вы должны «сгладить» эти списки. Вот как это можно сделать с помощью списка кортежей:
query_pairs = [(k,v) for k,vlist in d.iteritems() for v in vlist]
urllib.urlencode(query_pairs)
doseq=True
.
Может быть, вы ищете что-то вроде этого:
def dictToQuery(d):
query = ''
for key in d.keys():
query += str(key) + '=' + str(d[key]) + "&"
return query
Он берет словарь и преобразует его в строку запроса, как и urlencode. Он добавит последний символ «&» к строке запроса, но return query[:-1]
исправит это, если это проблема.
str.join()
еще не встречались ? Как насчет urllib.quote_plus()
?
urlencode
в urllib.py
(это должно быть в вашей установке Python), чтобы понять, почему создание строки запроса иногда не так просто, как предполагает ваш ответ (в частности, необходимость `` цитировать '' определенные символы, которые недопустимы в URL). @Ignacio также сослался на две функции, которые очистят вашу реализацию и сделают ее правильной.
from urllib.parse import urlencode; urlencode(your_dict)
) короче и проще этого! Я допускаю, что иногда разумно изобретать колесо, даже некачественно, когда доступ к существующим, хорошо спроектированным колесам дорого или неудобно, но здесь использовать готовое колесо проще и быстрее, чем катать собственное, некачественное. .
cgi.parse_qs()
устарело. Вместо этого используйте urlparse.parse_qs ().