如何迭代urlparse.urlsplit()结果Python

时间:2012-10-11 17:26:37

标签: python url urllib

假设我有这段代码:

>>> import urlparse
>>> url = "http://google.com"
>>> s = urlparse.urlsplit(url)
>>> print s
SplitResult(scheme='http', netloc='google.com', path='', query='', fragment='')
>>> print 'scheme ',s.scheme    
scheme  http
>>> print 'netloc ',s.netloc
netloc  google.com

如您所见,我可以手动迭代这些项目,但我该如何自动执行此操作?我想做这样的事情:

# This doesn't work:
for k,v in s.items():
    print '%s : %s'%(k,v)

2 个答案:

答案 0 :(得分:7)

您可以使用内部_asdict方法:

>>> import urlparse
>>> url = "http://google.com"
>>> s = urlparse.urlsplit(url)
>>> s
SplitResult(scheme='http', netloc='google.com', path='', query='', fragment='')
>>> s._asdict()
OrderedDict([('scheme', 'http'), ('netloc', 'google.com'), ('path', ''), ('query', ''), ('fragment', '')])
>>> d = s._asdict()
>>> for k,v in d.items():
...     print k, repr(v)
... 
scheme 'http'
netloc 'google.com'
path ''
query ''
fragment ''

为了澄清注释中提出的一点,尽管前缀_通常表示方法不是公共接口的一部分,但该方法是公共方法。它被赋予了前缀以避免名称冲突,因为namedtuple文档解释了[link]

  

为防止与字段名称,方法和属性名称冲突   从下划线开始。

在Python 3中,由于实现更改,这更容易:

>>> vars(urllib.parse.urlsplit("http://www.google.ca"))
OrderedDict([('scheme', 'http'), ('netloc', 'www.google.ca'), ('path', ''), ('query', ''), ('fragment', '')])

答案 1 :(得分:1)

>>> url = "http://google.com"
>>> s = urlparse.urlsplit(url)
>>> scheme, netloc, path, query, fragment = s
>>> scheme
'http'
>>> netloc
'google.com'
>>> path
''
>>> query
''
>>> fragment
''

如上所示,SplitResult实际上是一个奇特的元组,所以你也可以使用标准赋值。

>>> scheme, netloc, _, _, _ = s # I only want the scheme and netloc

享受。