用于dict python的URL查询参数

时间:2014-02-05 17:43:42

标签: python parsing url query-parameters

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

例如:

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

预期回报:

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

8 个答案:

答案 0 :(得分:121)

使用urllib.parse library

>>> 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

答案 1 :(得分:19)

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

>>> 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'}

答案 2 :(得分:7)

如果您不想使用解析器:

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

from urllib import urlparse as parse

我知道这与接受的答案相同,只是在可以复制的单行内容中。

答案 3 :(得分:3)

对于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'}

答案 4 :(得分:1)

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

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('&')]

我正在Idle IDE中使用3.6.5版。

答案 5 :(得分:0)

对于python2.7,我正在使用urlparse模块将网址查询解析为字典。

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']} 

答案 6 :(得分:0)

您可以轻松地使用特定的库来解析URL。

这是我的简单代码,无需任何专用库即可进行解析。

(输入的URL必须包含域名,协议和路径。

def parseURL(url):

#Sample URLS to copy
# url='https://www.facebook.com/photo.php?fbid=2068026323275211&set=a.269104153167446&type=3&theater'   
# url='http://www.blog.google.uk:1000/path/to/myfile.html?key1=value1&key2=value2#InTheDocument'      
# url='https://www.overleaf.com/9565720ckjijuhzpbccsd#/347876331/' 

如果名称 =='主要”: url = input(“输入您的URL:”) parseURL(url)

key = 'processed/copythisfile.txt'

答案 7 :(得分:0)

from urllib.parse import splitquery, parse_qs, parse_qsl

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

splitquery(url)
# ('http://www.example.org/default.html', 'ct=32&op=92&item=98&item=99')

parse_qs(splitquery(url)[1])
# {'ct': ['32'], 'op': ['92'], 'item': ['98', '99']}

dict(parse_qsl(splitquery(url)[1]))
# {'ct': '32', 'op': '92', 'item': '99'}

# also works with url w/o query
parse_qs(splitquery("http://example.org")[1])
# {}

dict(parse_qsl(splitquery("http://example.org")[1]))
# {}

老问题,虽然在我遇到这个 splitquery 东西后我会插手。不确定 Python 2,因为我不使用 Python 2。splitqueryre.split(r"\?", url, 1) 多一点。