Как после использования 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 ().