Як використовувати 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 ().