将URL的标题部分拆分为单独的列--Python

时间:2016-03-17 17:34:39

标签: python python-2.7 urlparse

假设我有一个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”开头并以“&”结尾拆分它?

由于

5 个答案:

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