Python的`urlparse`:向URL添加GET参数

5 投票
4 回答
1901 浏览
提问于 2025-04-16 13:15

我正在做这个:

urlparse.urljoin('http://example.com/mypage', '?name=joe')

结果是这个:

'http://example.com/?name=joe'

但我想要的是这个:

'http://example.com/mypage?name=joe'

我哪里做错了呢?

4 个回答

1

你遇到了一个已知的问题,这个问题影响了Python 2.4到2.6的版本。

如果你无法更改或修补你的Python版本,可以参考@jd的解决方案来绕过这个问题。

不过,如果你需要一个更通用的解决方案,像标准的urljoin那样工作,你可以使用一个包装方法,这个方法为特定的使用情况实现了这个解决方案,其他情况下则默认使用标准的urljoin()

例如:

import urlparse

def myurljoin(base, url, allow_fragments=True):
    if url[0] != "?": 
        return urlparse.urljoin(base, url, allow_fragments)
    if not allow_fragments: 
        url = url.split("#", 1)[0]
    parsed = list(urlparse.urlparse(base))
    parsed[4] = url[1:] # assign params field
    return urlparse.urlunparse(parsed)
5

你可以使用 urlparse.urlunparse 这个方法:

import urlparse
parsed = list(urlparse.urlparse('http://example.com/mypage'))
parsed[4] = 'name=joe'
urlparse.urlunparse(parsed)
1

我通过把Python 2.6的urlparse模块和我的项目打包在一起解决了这个问题。同时,我还需要把namedtuple也打包进去,因为urlparse模块用到了它,而namedtuple是在collections里面定义的。

撰写回答