在Python 2中是否有更简洁的方法来修改URL的某些部分?
例如
http://foo/bar -> http://foo/yah
目前,我正在这样做:
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)
有更清洁的解决方案吗?
答案 0 :(得分:20)
不幸的是,文档已经过时了; urlparse.urlparse()
(和urlparse.urlsplit()
)生成的结果使用collections.namedtuple()
-produced class作为基础。
不要将此命名元素转换为列表,但要使用为此任务提供的实用程序方法:
parts = urlparse.urlparse(url)
parts = parts._replace(path='yah')
url = parts.geturl()
namedtuple._replace()
method可让您创建一个替换了特定元素的新副本。 ParseResult.geturl()
method然后将部分重新加入到网址中。
演示:
>>> import urlparse
>>> url = 'http://foo/bar'
>>> parts = urlparse.urlparse(url)
>>> parts = parts._replace(path='yah')
>>> parts.geturl()
'http://foo/yah'
mgilson提交bug report (with patch)来解决文档问题。
答案 1 :(得分:-1)
我想这样做的正确方法就是这样。
不建议使用_replace
私有方法或变量。
from urlparse import urlparse, urlunparse
res = urlparse('http://www.goog.com:80/this/is/path/;param=paramval?q=val&foo=bar#hash')
l_res = list(res)
# this willhave ['http', 'www.goog.com:80', '/this/is/path/', 'param=paramval', 'q=val&foo=bar', 'hash']
l_res[2] = '/new/path'
urlunparse(l_res)
# outputs 'http://www.goog.com:80/new/path;param=paramval?q=val&foo=bar#hash'