Python的`urlparse`:向URL添加GET参数
我正在做这个:
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
里面定义的。