用于 dictpython 的 URL 查询参数

有没有一种方法可以解析 URL (使用某个 python 库)并返回一个 python 字典,其中包含 URL 中查询参数部分的键和值?

例如:

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

预期回报:

{'ct':32, 'op':92, 'item':98}
132008 次浏览

使用 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()方法解析出查询字符串,考虑到键可能出现不止一次,而且顺序可能很重要。

如果您仍然在使用 Python2,则 urllib.parse被称为 urlparse

对于 Python3,来自 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'}

如果您不喜欢使用解析器:

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

我知道这是相同的接受的答案,只是在一个班轮,可以复制。

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

我不同意重造轮子,但是有时候(当你在学习的时候)为了理解一个轮子建造一个轮子是有帮助的。:)所以,从纯学术的角度来看,我提出这个警告,使用字典假设名称值对是唯一的(查询字符串不包含多条记录)。

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版本。

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

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

下面是我的简单代码,不需要任何专用库就可以解析它。

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

Def parseURL (url) :

seg2 = url.split('/')[2]    # Separating domain name
seg1 = url.split(seg2)[-2]  # Deriving protocol
print('Protocol:', seg1, '\n')
print('Domain name:', seg2, '\n')
seg3 = url.split(seg2)[1]   #Getting the path; if output is empty,the there is no path in URL
print('Path:', seg3, '\n')


if '#' in url:  # Extracting fragment id, else None
seg4 = url.split('#')[1]
print('Fragment ID:', seg4, '\n')
else:
seg4 = 'None'
if '@' in url:              # Extracting user name, else None
seg5 = url.split('/')[-1]
print('Scheme with User Name:', seg5, '\n')
else:
seg5 = 'None'
if '?' in url:              # Extracting query string, else None
seg6 = url.split('?')[-1]
print('Query string:', seg6, '\n')
else:
seg6 = 'None'


print('**The dictionary is in the sequence: 0.URL 1.Protocol 2.Domain name 3.Path 4.Fragment id 5.User name 6.Query string** \n')


dictionary = {'0.URL': url, '1.Protocol': seg1, '2.Domain name': seg2, '3.Path': seg3, '4.Fragment id': seg4,
'5.User name': seg5, '6.Query string': seg6}  # Printing required dictionary
print(dictionary, '\n')


print('The TLD in the given URL is following: ')
if '.com' in url:           # Extracting most famous TLDs maintained by ICAAN
print('.com\n')
elif '.de' in url:
print('.de\n')
elif '.uk' in url:
print('.uk\n')
elif 'gov' in url:
print('gov\n')
elif '.org' in url:
print('.org\n')
elif '.ru' in url:
print('.ru\n')
elif '.net' in url:
print('.net\n')
elif '.info' in url:
print('.info\n')
elif '.biz' in url:
print('.biz\n')
elif '.online' in url:
print('.online\n')
elif '.in' in url:
print('.in\n')
elif '.edu' in url:
print('.edu\n')
else:
print('Other low level domain!\n')


return dictionary

如果 姓名 = = ‘ 总台’: URL = input (“ Enter your URL:”) 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/'
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。splitquery略高于 re.split(r"\?", url, 1)

WSGI 蟒蛇2.7

密码

    import sys
import json
import cgi
import urlparse


def application(environ, start_response):


status = '200 OK'


method = environ['REQUEST_METHOD']
args = urlparse.parse_qs(environ['QUERY_STRING'])
m = args['mesg']


x = {
"input": m[0],
"result": m[0].capitalize()
}


# convert into JSON:
y = json.dumps(x)


output = y


response_headers = [('Content-type', 'application/json'),
('Content-Length', str(len(output)))]
start_response(status, response_headers)
print (sys.version_info)
return [output]

网址

Http:///echo.py?mesg=hola

回应

{“ input”: “ Hola”,“ result”: “ Hola”}