字典python的URL查询参数


101

有没有一种方法可以解析网址(带有某些python库)并返回带有该网址查询参数部分的键和值的python字典?

例如:

url = "http://www.example.org/default.html?ct=32&op=92&item=98"

预期收益:

{'ct':32, 'op':92, 'item':98}

Answers:


191

使用urllib.parse

>>> from urllib import parse
>>> url = "http://www.example.org/default.html?ct=32&op=92&item=98"
>>> parse.urlsplit(url)
SplitResult(scheme='http', netloc='www.example.org', path='/default.html', query='ct=32&op=92&item=98', fragment='')
>>> parse.parse_qs(parse.urlsplit(url).query)
{'item': ['98'], 'op': ['92'], 'ct': ['32']}
>>> dict(parse.parse_qsl(parse.urlsplit(url).query))
{'item': '98', 'op': '92', 'ct': '32'}

urllib.parse.parse_qs()urllib.parse.parse_qsl()方法解析出查询字符串,考虑到钥匙可能会出现不止一次和顺序可能无关紧要。

如果您仍在使用Python 2,urllib.parse则称为urlparse


38

对于Python 3,dict from的值parse_qs在列表中,因为可能有多个值。如果您只想要第一个:

>>> from urllib.parse import urlsplit, parse_qs
>>>
>>> url = "http://www.example.org/default.html?ct=32&op=92&item=98"
>>> query = urlsplit(url).query
>>> params = parse_qs(query)
>>> params
{'item': ['98'], 'op': ['92'], 'ct': ['32']}
>>> dict(params)
{'item': ['98'], 'op': ['92'], 'ct': ['32']}
>>> {k: v[0] for k, v in params.items()}
{'item': '98', 'op': '92', 'ct': '32'}

1
这不是Python 3所独有的,Python 2 urllib.parse_qs还返回值的列表。顺便说一句,我在回答中特别提到了这一点,如果您只想使用单个值urllib.parse_qsl()dict()则可能要使用它并将结果列表放到上面。
马丁·彼得斯

好像有区别parse_qls的是,因为它返回一个元组列表,将一个字典将保持最后的值,而不是第一个。当然,这假设有多个值开始。
reubano '18

11

如果您不想使用解析器:

url = "http://www.example.org/default.html?ct=32&op=92&item=98"
url = url.split("?")[1]
dict = {x[0] : x[1] for x in [x.split("=") for x in url[1:].split("&") ]}

因此,我不会删除上面的内容,但是绝对不是您应该使用的内容。

我想我读了一些答案,而且它们看起来有些复杂,以防万一您像我一样,不要使用我的解决方案。

用这个:

from urllib import parse
params = dict(parse.parse_qsl(parse.urlsplit(url).query))

而对于Python 2.X

import urlparse as parse
params = dict(parse.parse_qsl(parse.urlsplit(url).query))

我知道这与接受的答案相同,只是在一个可以复制的衬里上。


7
解析不仅涉及拆分字符串。您还需要处理URL编码(包括+),并且urllib.parse还会根据您的要求引发或忽略错误。我不确定为什么当它是标准库的一部分时,您为什么要重新发明它。
马丁·彼得斯

6

对于python 2.7

In [14]: url = "http://www.example.org/default.html?ct=32&op=92&item=98"

In [15]: from urlparse import urlparse, parse_qsl

In [16]: parse_url = urlparse(url)

In [17]: query_dict = dict(parse_qsl(parse_url.query))

In [18]: query_dict
Out[18]: {'ct': '32', 'item': '98', 'op': '92'}

5

我同意不重新发明轮子,但有时(在您学习时)有助于构建轮子以便理解轮子。:)因此,从纯粹的学术角度来看,我提供了一个警告,即使用字典假定名称/值对是唯一的(查询字符串不包含多个记录)。

url = 'http:/mypage.html?one=1&two=2&three=3'

page, query = url.split('?')

names_values_dict = dict(pair.split('=') for pair in query.split('&'))

names_values_list = [pair.split('=') for pair in query.split('&')]

我在空闲IDE中使用3.6.5版。


0

对于python2.7我正在使用urlparse模块来解析URL查询到字典。

import urlparse

url = "http://www.example.org/default.html?ct=32&op=92&item=98"

print urlparse.parse_qs( urlparse.urlparse(url).query )
# result: {'item': ['98'], 'op': ['92'], 'ct': ['32']} 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.