假设我有一个URL如下:
http://sitename.com/pathname?title=moviename&url=VIDEO_URL
我想解析此URL以单独获取标题部分和网址部分。
我尝试了以下内容,
from urlparse import urlparse
q = urlparse('http://sitename.com/pathname?title=moviename&url=VIDEO_URL')
执行此操作后,我得到以下结果,
q
ParseResult(scheme='http', netloc='sitename.com', path='/pathname', params='', query='title=moviename&url=VIDEO_URL', fragment='')
和q.query
有,
'title=moviename&url=VIDEO_URL'
我无法在这里使用q.query.title或q.query.url。有没有办法可以访问它?我想将url和title部分分开分成不同的列。我们可以这样做吗,或者我们可以编写一个子字符串方法来检查以“title”开头并以“&”结尾拆分它?
由于
答案 0 :(得分:7)
您可以在此处使用urlparse.parse_qs
制作参数字典。
from urlparse import urlparse, parse_qs
q = urlparse('http://sitename.com/pathname?title=moviename&url=VIDEO_URL')
qs = parse_qs(q.query)
print qs["title"] # moviename
print qs["url"] # VIDEO_URL
这是解析网址参数的最可靠方法:比split
好得多。
答案 1 :(得分:1)
span
可以解析网址,从那里获取urlparse
并解析:
query
由于查询字符串参数可以多次出现,因此字典会提供找到的值列表(即使只找到一个值。)
答案 2 :(得分:0)
您做得对,只是标准网址由以下网址组成:
<SCHEME>://<NETLOC>/<PATH>?<QUERY>
所以你想从查询中提取细节就是分割字符串,如果你喜欢脏话:
>>> data = dict(item.split('=') for item in q.query.split('&'))
>>> data
{'url': 'VIDEO_URL', 'title': 'moviename'}
>>> print(data['url'])
你有你的网址!这是urlparse
库通过parse_qsl()
method提供的基本和规范版本。该方法还会将+
转换为空格,句柄&#39 ;;&#39;以及&
并取消引用该网址。
因此,要使用urlparse的parse_qsl
功能,您所要做的就是:
>> data =urlparse.parse_qsl(q.query)
{'url': 'VIDEO_URL', 'title': 'moviename'}
>>> print(data['url'])
N.B。:{strong>不安全使用parse_qsl
而不是split()
方法,但更可靠。主要区别在于parse_qsl
将适用于RFC定义的所有可能的查询用例,而split()
方法适用于单个案例。
答案 3 :(得分:0)
这些答案适用于解析查询字符串。要更进一步并使用点表示法,请参阅Convert Python dict to object?
from collections import namedtuple
QS = namedtuple('QS', qs.keys())
dotted_qs = QS(**qs)
dotted_qs.url #['moviename']
请注意,从dict
返回的parse_qs
可以是多值的,因此列表返回类型为dotted.url
。您可以使用字典理解或parse_qsl
:
qs = {k: v[0] for k, v in q.query.items()}
或者...
qs = dict(urlparse.parse_qsl(q.query.items()))
希望有所帮助。
答案 4 :(得分:-1)
要获得由&#39;&amp;&#39;分割的查询参数。你可以使用:
q.query.split('&')
或者要获得可以使用的参数/值对:
args = [tuple(arg.split('=')) for arg in q.query.split('&')]