2016-04-29 2 views
1

Я могу разобрать url с помощью urlsplit и получить параметры с использованием аргумента query.Сплит-список возвращен с urlparse в python

url является '/api/v1/test?par1=val1&par2=val2a%3D1%26val2b%3Dfoo%26val2c%3Dbar'

После использования urlsplit и запрос я получаю

'par1=val1&par2=val2a%3D1%26val2b%3Dfoo%26val2c%3Dbar'

И после запуска parse_qs на выше я получаю

{'par2': ['val2a=1&val2b=foo&val2c=bar'], 'par1': ['val1']}

Вот выход, который точно что мне нужно

'par1': ['val1']

я получаю возвращение как список для одного из параметров, который декодируется данные, как показано ниже

'par2': ['val2a=1&val2b=foo&val2c=bar]

можно разделить par2 используя метод split на & и = и получить val2a ...

Но есть ли лучший способ для этого?

+1

Пожалуйста, добавьте 'url', который вы также разбираете. – AKS

+0

@AKS обновлен с адресом – user2661518

+0

Пожалуйста, проверьте мой ответ. – AKS

ответ

2

Вы можете снова использовать parse_qs на значении par2

>>> url = '/api/v1/test?par1=val1&par2=val2a%3D1%26val2b%3Dfoo%26val2c%3Dbar' 
>>> q = parse_qs(urlparse(url).query) 
>>> q 
{'par2': ['val2a=1&val2b=foo&val2c=bar'], 'par1': ['val1']} 
>>> parse_qs(q['par2'][0]) 
{'val2b': ['foo'], 'val2c': ['bar'], 'val2a': ['1']} 

После последнего результата вы можете получить значение val2a и т.д.

1

split на & и partition на =, вероятно, самый простой и наиболее эффективным способом.

result = {k: v for k, _, v in (pair.partition('=') for pair in values.split('&'))} 
# or 
result = dict(pair.split('=') for pair in values.split('&')) 

Использование re.sub() другой вариант, но я считаю, что это чуть более усложнять вещи.