5

我正在这样做:

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

我明白了:

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

虽然我想得到这个:

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

我究竟做错了什么?

4

4 回答 4

5

你可以使用 urlparse.urlunparse :

import urlparse
parsed = list(urlparse.urlparse('http://example.com/mypage'))
parsed[4] = 'name=joe'
urlparse.urlunparse(parsed)
于 2011-03-08T13:22:22.657 回答
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)
于 2011-03-08T13:56:44.623 回答
1

我通过将 Python 2.6 的urlparse模块与我的项目捆绑在一起解决了这个问题。我还必须捆绑namedtuple在 中定义的collections,因为urlparse使用它。

于 2011-03-08T16:14:19.843 回答
0

你确定吗?在 Python 2.7 上:

>>> import urlparse
>>> urlparse.urljoin('http://example.com/mypage', '?name=joe')
'http://example.com/mypage?name=joe'
于 2011-03-08T12:59:22.607 回答