Python解析查询字符串为列表
我有一个表单,用来把数据提交到服务器,内容大概是这样的:
videos[0][type]=Vimeo&
videos[0][moments][0][time]=11&
videos[0][moments][0][lng]=111&
videos[0][moments][0][lat]=111&
videos[0][moments][1][time]=222&
videos[0][moments][1][lng]=222&
videos[0][moments][1][lat]=222&
videos[1][type]=YouTube&
videos[1][moments][0][time]=111&
videos[1][moments][0][lng]=111&
videos[1][moments][0][lat]=111
...
我正在使用Flask框架,想要循环遍历一下videos
和moments
,但似乎没有办法做到这一点。我试着在谷歌上找一些库,但今天我的搜索能力不太行。
有没有什么建议?谢谢!
编辑:根据lazy1的回答,我修改了他/她的代码,变成了:
def add(root, path, value):
for part in path[:-1]:
root = root.setdefault(part, {})
root[path[-1]] = value
def parse(s):
items = {}
for key, value in parse_qsl(s):
parts = filter(None, re.split('[\[\]]', key))
name = parts[0]
if name not in items:
items[name] = {}
add(items[name], parts[1:], value)
return items
这样可以生成一个哈希值:
{'map': {'title': 'orange'}, 'videos': {'1': {'moments': {'0': {'lat': '111', 'lng': '111', 'time': '111'}}, 'type': 'YouTube'}, '0': {'moments': {'1': {'lat': '222', 'lng': '222', 'time': '222'}, '0': {'lat': '111', 'lng': '111', 'time': '11'}}, 'type': 'Vimeo'}}}
对于一个查询,看起来像这样:
map[title]=orange&
videos[0][type]=Vimeo&
videos[0][moments][0][time]=11&
videos[0][moments][0][lng]=111&
videos[0][moments][0][lat]=111&
videos[0][moments][1][time]=222&
videos[0][moments][1][lng]=222&
videos[0][moments][1][lat]=222&
videos[1][type]=YouTube&
videos[1][moments][0][time]=111&
videos[1][moments][0][lng]=111&
videos[1][moments][0][lat]=111
...
2 个回答
2
如果你使用了 formencode,并且可以把你的键的格式改成:
map.title=orange&
videos-0.type=Vimeo&
videos-0.moments-0.time=11&
videos-0.moments-0.lng=111&
videos-0.moments-0.lat=111&
videos-0.moments-1.time=222&
videos-0.moments-1.lng=222&
videos-0.moments-1.lat=222&
videos-1.type=YouTube&
videos-1.moments-0.time]=111&
videos-1.moments-0.lng]=111&
videos-1.moments-0.lat]=111
那么你可以使用:
from urlparse import parse_qsl
from formencode.variabledecode import variable_decode
def parse(s):
return variable_decode(parse_qsl(s))
这样就能得到:
{
'map': {'title': 'orange'},
'videos': [
{
'moments': [ {'lat': '111', 'lng': '111', 'time': '11'},
{'lat': '222', 'lng': '222', 'time': '222'}],
'type': 'Vimeo'
}, {
'moments': [ {'lat': '111', 'lng': '111', 'time': '111'} ],
'type': 'YouTube'
}
]
}
3
你可以使用 urlparse.parse_qsl 来获取网址中的查询参数。不过,你需要手动创建视频对象。
下面是一个示例实现:
def add(root, path, value):
for part in path[:-1]:
root = root.setdefault(part, {})
root[path[-1]] = value
def parse(s):
videos = {}
for key, value in parse_qsl(s):
parts = filter(None, re.split('[\[\]]', key))
insert(videos, parts[1:], value)
return videos