urlencode массив значений - PullRequest
       1

urlencode массив значений

39 голосов
/ 03 апреля 2010

Я пытаюсь кодировать словарь в python с помощью urllib.urlencode. Проблема в том, что я должен кодировать массив.

Результат должен быть:

criterias%5B%5D=member&criterias%5B%5D=issue
#unquoted: criterias[]=member&criterias[]=issue

Но результат, который я получаю:

criterias=%5B%27member%27%2C+%27issue%27%5D
#unquoted: criterias=['member',+'issue']

Я пробовал несколько вещей, но, похоже, не могу получить правильный результат.

import urllib
criterias = ['member', 'issue']
params = {
    'criterias[]': criterias,
}
print urllib.urlencode(params)

Если я использую cgi.parse_qs для декодирования правильной строки запроса, я получаю это как результат:

{'criterias[]': ['member', 'issue']}

Но если я закодирую этот результат, я получу неверный результат. Есть ли способ получить ожидаемый результат?

Ответы [ 5 ]

67 голосов
/ 19 апреля 2012

Решение гораздо проще, чем перечисленные выше.

>>> import urllib
>>> params = {'criterias[]': ['member', 'issue']}
>>> 
>>> print urllib.urlencode(params, True)
criterias%5B%5D=member&criterias%5B%5D=issue

Обратите внимание на Истину. См. http://docs.python.org/library/urllib.html#urllib.urlencode переменная дозы.

Как примечание: вам не нужно, чтобы он работал как массив (поэтому urllib его не включает) Это означает, что вам не нужно добавлять [] ко всем ключам массива.

11 голосов
/ 03 апреля 2010

Вы можете использовать список пар ключ-значение (кортежи):

>>> urllib.urlencode([('criterias[]', 'member'), ('criterias[]', 'issue')])
'criterias%5B%5D=member&criterias%5B%5D=issue'
2 голосов
/ 26 октября 2010

Чтобы абстрагировать это для работы с любым словарем параметров и преобразовать его в список кортежей:

import urllib

def url_encode_params(params={}):
    if not isinstance(params, dict): 
        raise Exception("You must pass in a dictionary!")
    params_list = []
    for k,v in params.items():
        if isinstance(v, list): params_list.extend([(k, x) for x in v])
        else: params_list.append((k, v))
    return urllib.urlencode(params_list)

Что теперь должно работать как для приведенного выше примера, так и для словаря с некоторыми строками и некоторыми массивами в качестве значений:

criterias = ['member', 'issue']
params = {
    'criterias[]': criterias,
}
url_encode_params(params)
>>'criterias%5B%5D=member&criterias%5B%5D=issue' 
2 голосов
/ 03 апреля 2010

Listcomp значений:

>>> criterias = ['member', 'issue']
>>> urllib.urlencode([('criterias[]', i) for i in criterias])
'criterias%5B%5D=member&criterias%5B%5D=issue'
>>> 
0 голосов
/ 11 июня 2019

, как aws api определяет свой get url: params.0=foo&params.1=bar

однако, недостатком является то, что вам нужно написать код для кодирования и декодирования самостоятельно, в результате: params = [foo, bar]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...