在Python 2中修改URL组件

Gar*_*ell 8 python url python-2.x urlparse

有没有更简洁的方法来修改Python 2中URL的某些部分?

例如

http://foo/bar -> http://foo/yah
Run Code Online (Sandbox Code Playgroud)

目前,我这样做:

import urlparse

url = 'http://foo/bar'

# Modify path component of URL from 'bar' to 'yah'
# Use nasty convert-to-list hack due to urlparse.ParseResult being immutable
parts = list(urlparse.urlparse(url))
parts[2] = 'yah'

url = urlparse.urlunparse(parts)
Run Code Online (Sandbox Code Playgroud)

有更清洁的解决方案吗?

Mar*_*ers 22

不幸的是,文档已经过时了; urlparse.urlparse()(和urlparse.urlsplit())产生的结果使用一个collections.namedtuple()生产的类作为基础.

不要将此namedtuple转换为列表,而是使用为此任务提供的实用程序方法:

parts = urlparse.urlparse(url)
parts = parts._replace(path='yah')

url = parts.geturl()
Run Code Online (Sandbox Code Playgroud)

namedtuple._replace()方法允许您创建一个替换了特定元素的新副本.然后,该ParseResult.geturl()方法将部件重新连接到您的URL中.

演示:

>>> import urlparse
>>> url = 'http://foo/bar'
>>> parts = urlparse.urlparse(url)
>>> parts = parts._replace(path='yah')
>>> parts.geturl()
'http://foo/yah'
Run Code Online (Sandbox Code Playgroud)

mgilson提交了一份错误报告(带补丁)以解决文档问题.