修改Python 2中的URL组件

2024-04-26 03:02:01 发布

您现在位置:Python中文网/ 问答频道 /正文

在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)

有更干净的解决方案吗?


Tags: topath方法importhttpurlfoobar
2条回答

我想正确的方法是这样做。

由于使用_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'

不幸的是,文档已经过时;由urlparse.urlparse()(和urlparse.urlsplit())生成的结果使用^{}-produced class作为基础。

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

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

url = parts.geturl()

使用^{} method可以创建替换了特定元素的新副本。然后^{} method将这些部分重新连接到一个url中。

演示:

>>> 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)来解决文档问题。

相关问题 更多 >