2016-03-17 22 views
1

假设我有一个网址如下:斯普利特URL到一个单独的列标题的一部分 - 的Python

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。有没有一种方法可以访问它?我想将网址和标题部分分开分成不同的列。我们可以这样做,还是我们可以编写一个子字符串方法,检查以“标题”开头并以“&”结尾并将其拆分?

感谢

+0

尝试:q.query.split('&') – avip

回答

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好得多。

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() method提供的非常基本和规范的版本。该方法还将+转换为空格,句柄';'以及&并取消引用网址。

所以使用里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()方法适用于单例。

-1

得到的只是由 '&' 将查询参数,你可以使用:

q.query.split('&')

或获得对参数/值,你可以使用:

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

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

作为查询字符串参数可以出现多次,词典提供发现的值的列表(即使当仅存在一个发现值。)

0

这些答案是点上,用于解析查询字符串。为了进一步走了一步,还可以使用点符号,也看到Convert Python dict to object?

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

注意,来自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())) 

希望有所帮助。