用于dict python的URL查询参数

Leo*_*ade 78 python url parsing query-parameters

有没有办法解析URL(带有一些python库)并返回一个python字典,其中包含URL和查询参数值的一部分?

例如:

url = "http://www.example.org/default.html?ct=32&op=92&item=98"
Run Code Online (Sandbox Code Playgroud)

预期收益:

{'ct':32, 'op':92, 'item':98}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 153

使用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'}
Run Code Online (Sandbox Code Playgroud)

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

如果您还在使用Python 2,则会urllib.parse被调用urlparse.

  • 或者`为Python3导入urllib.parse为urlparse`. (11认同)

reu*_*ano 29

对于Python 3,dict的值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'}
Run Code Online (Sandbox Code Playgroud)

  • 这并不是 Python 3 独有的,Python 2 `urllib.parse_qs` 也返回值的列表。我在回答中特别提到了这一点,顺便说一句,您可能想要使用 [`urllib.parse_qsl()`](https://docs.python.org/3/library/urllib.parse.html#urllib.parse如果您只想要单个值,请改为使用 .parse_qsl) 并将结果列表传递到“dict()”。 (2认同)

Tom*_*ams 9

如果您不想使用解析器:

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("&") ]}
Run Code Online (Sandbox Code Playgroud)

所以我不会删除上面的内容,但绝对不是你应该使用的内容.

我想我读了一些答案,看起来有点复杂,因为你喜欢我,不要使用我的解决方案.

用这个:

from urllib import parse
params = dict(parse.parse_qsl(parse.urlsplit(url).query))
Run Code Online (Sandbox Code Playgroud)

并为Python 2.X

from urllib import urlparse as parse
Run Code Online (Sandbox Code Playgroud)

我知道这与接受的答案是一样的,只是在一个可以复制的班轮中.

  • 解析不仅仅涉及拆分字符串.您还需要处理URL编码(包括`+`),并且`urllib.parse`也可以根据请求为您引发或忽略错误.当它是标准库的一部分时,我不确定你为什么要重新发明这个轮子. (3认同)

Anu*_*sra 7

对于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'}
Run Code Online (Sandbox Code Playgroud)


Cla*_*ius 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('&')]
Run Code Online (Sandbox Code Playgroud)

我在空闲 IDE 中使用 3.6.5 版。