Як використовувати cgi.parse_qs(), як перетворити результат (словник) назад у рядок запиту? Шукаєте щось подібне urllib.urlencode().
Як використовувати cgi.parse_qs(), як перетворити результат (словник) назад у рядок запиту? Шукаєте щось подібне urllib.urlencode().
Відповіді:
urllib.parse.urlencode(запит, doseq = хибний, [...])Перетворіть об’єкт відображення або послідовність двоелементних кортежів, які можуть містити str або байтові об'єкти, у текстовий рядок ASCII, кодований відсотками.
A dict- це відображення.
urllib.urlencode(query[,doseq])
Перетворіть об’єкт відображення або послідовність двоелементних кортежів у рядок "закодованого у відсотках" ... рядkey=valueпар, розділених'&'символами ...
dictповернене 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 ().