1

假设我有一个如下 URL:

http://sitename.com/pathname?title=moviename&url=VIDEO_URL

我想解析这个 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”开头并以“&”结尾并拆分它?

谢谢

4

5 回答 5

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

这是解析 URL 参数最可靠的方法:比split.

于 2016-03-17T17:42:03.410 回答
1

urlparse可以解析 url,从那里获取query并解析:

>>> import urlparse
>>> url = 'http://sitename.com/pathname?title=moviename&url=VIDEO_URL'
>>> urlparse.parse_qs(urlparse.urlparse(url).query)
{'title': ['moviename'], 'url': ['VIDEO_URL']}

由于查询字符串参数可以出现多次,因此字典提供了找到的值的列表(即使只找到一个值。)

于 2016-03-17T17:47:37.417 回答
0

这些答案可用于解析查询字符串。要更进一步并使用点表示法,另请参阅将 Python dict 转换为对象?

from collections import namedtuple
QS = namedtuple('QS', qs.keys())
dotted_qs = QS(**qs)
dotted_qs.url #['moviename']

请注意,dict返回的parse_qs可以是多值的,因此列表返回类型为dotted.url. 您可以使用 dict 理解将其折叠为单个值或parse_qsl

qs = {k: v[0] for k, v in q.query.items()} 

或者...

qs = dict(urlparse.parse_qsl(q.query.items()))

希望有帮助。

于 2016-03-17T17:48:22.853 回答
0

你做对了,只是一个标准的 URL 是由以下组成的:

<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()方法提供的一个非常基本和规范的版本。该方法也转换+成空格,句柄';' 以及&取消引用 URL。

所以要使用 urlparse 的parse_qsl功能,你所要做的就是:

>> data =urlparse.parse_qsl(q.query)
{'url': 'VIDEO_URL', 'title': 'moviename'}
>>> print(data['url'])

注意:使用起来并不parse_qslsplit()方法更安全,但更可靠。主要区别在于parse_qsl它将适用于 RFC 定义的所有可能的查询用例,而该split()方法适用于单个案例。

于 2016-03-17T17:41:25.960 回答
-1

要仅获取由“&”分隔的查询参数,您可以使用:

q.query.split('&')

或者要获得成对的参数/值,您可以使用:

args = [tuple(arg.split('=')) for arg in q.query.split('&')]

于 2016-03-17T17:42:49.930 回答