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

Split the title part of the URL into a separate column - Python

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

谢谢

你做对了,只是一个标准 URL 是由:

<SCHEME>://<NETLOC>/<PATH>?<QUERY>

所以你想要从查询中提取详细信息是拆分字符串,就像那样,如果你喜欢肮脏的方式

>>> data = dict(item.split('=') for item in q.query.split('&'))
>>> data
{'url': 'VIDEO_URL', 'title': 'moviename'}
>>> print(data['url'])

你有你的URL!这是 urlparse 库通过 parse_qsl() method 提供的一个非常基本和规范的版本。该方法还将 + 转换为空格,处理 ';'以及 & 并取消引用 URL.

所以要使用 urlparse 的 parse_qsl 函数,你所要做的就是:

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

N.B.: 使用 parse_qslsplit() 方法不安全,但是更可靠。主要区别在于 parse_qsl 将适用于 RFC 定义的所有可能的查询用例,而 split() 方法适用于单个案例。

这里可以使用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 好得多。

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

q.query.split('&')

或者要获得成对的 parameter/value,您可以使用:

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

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

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

这些答案很适合解析查询字符串。要更进一步并使用点符号,另请参阅 Convert Python dict to object?

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

请注意,从 parse_qs 返回的 dict 可以是多值的,因此 dotted.url 的列表 return 类型。您可以使用字典理解或 parse_qsl:

将其折叠为单个值
qs = {k: v[0] for k, v in q.query.items()} 

或者...

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

希望对您有所帮助。