我这样做:
urlparse.urljoin('http://example.com/mypage', '?name=joe')
我明白了:
'http://example.com/?name=joe'
虽然我想得到这个:
'http://example.com/mypage?name=joe'
我做错了什么?
答案 0 :(得分:5)
您可以使用urlparse.urlunparse:
import urlparse
parsed = list(urlparse.urlparse('http://example.com/mypage'))
parsed[4] = 'name=joe'
urlparse.urlunparse(parsed)
答案 1 :(得分:1)
您遇到影响Python 2.4-2.6的a known bug。
如果您无法更改或修补您的Python版本,@jd's solution将解决此问题。
但是,如果您需要一个更通用的解决方案作为标准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)
答案 2 :(得分:1)
我通过将Python 2.6的urlparse
模块与我的项目捆绑在一起解决了这个问题。我还必须捆绑namedtuple
中定义的collections
,因为urlparse
使用它。
答案 3 :(得分:0)
>>> import urlparse
>>> urlparse.urljoin('http://example.com/mypage', '?name=joe')
'http://example.com/mypage?name=joe'