dict python的URL查询参数

dict python的URL查询参数,python,parsing,url,query-parameters,Python,Parsing,Url,Query Parameters,有没有一种方法可以解析URL(使用一些python库)并返回包含URL中查询参数部分的键和值的python字典 例如: url = "http://www.example.org/default.html?ct=32&op=92&item=98" 预期回报: {'ct':32, 'op':92, 'item':98} 使用: urllib.parse.parse_qs()和urllib.parse.parse_qsl()方法解析出查询字符串,考虑到键可以出现多次,并且顺序可能

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

例如:

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

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

urllib.parse.parse_qs()
urllib.parse.parse_qsl()
方法解析出查询字符串,考虑到键可以出现多次,并且顺序可能很重要


如果您仍在Python 2上,则调用了
urllib.parse

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

如果不希望使用解析器,请执行以下操作:

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

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


我正在空闲IDE中使用3.6.5版。

对于
python2.7
我正在使用
urlparse
模块来解析要dict的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解析url(url):

如果name='main': url=输入(“输入您的url:”) 解析url(url)


老问题,虽然在我遇到这个
splitquery
thingy之后我会插嘴。我不确定Python 2,因为我不使用Python 2。
splitquery
re.split(r“\?”,url,1)稍微多一些

这不是Python3独有的,Python2
urllib.parse_qs
也会返回值的列表。我在回答中特别提到了这一点,顺便说一句,您可能希望使用,并将结果列表传递到
dict()
如果您只需要单个值。似乎与
parse_qls
的区别在于,由于它返回元组列表,将其转换为dict将保留最后一个值而不是第一个值。当然,这假设有多个值开始。解析涉及的不仅仅是拆分字符串。您还需要处理e URL编码(包括
+
),并且,
urllib.parse
也会根据请求为您引发或忽略错误。我不确定当它是标准库的一部分时,您为什么要重新创建此控制盘。是否有一种方法不通过删除该项来重建原始url。TLD检测部分可能不适用于此类url:
https://www.info.ca/
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('&')]
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']} 
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
#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]))
# {}