urlparse的奇怪行为

时间:2012-12-08 02:22:35

标签: python url urlparse

我想知道是否有一些已知的变通方法可以解决我在python的urlparse中看到的一些奇怪的行为。

以下是python interpeter中几行的一些结果:

>>> import urlparse
>>> urlparse.parse_qsl('https://localhost/?code=bork&charlie=brown')
[('https://localhost/?code', 'bork'), ('charlie', 'brown')]

在上面的例子中,为什么第一个值'https:// localhost /?code'的键?它不应该只是'代码'吗?注意:parse_qs具有相同的不良行为。

>>> urlparse.urlparse('abcd://location/?code=bork&charlie=brown')
ParseResult(scheme='abcd', netloc='location', path='/?code=bork&charlie=brown', params='', query='', fragment='')
>>> urlparse.urlparse('https://location/?code=bork&charlie=brown')
ParseResult(scheme='https', netloc='location', path='/', params='', query='code=bork&charlie=brown', fragment='')

在上面的示例中,请注意查询字符串并不总是被放入查询值中。为什么协议很重要?查询字段不应该始终获取查询字符串吗?使用'ftp'或其他众所周知的协议进行测试似乎也不满意。

2 个答案:

答案 0 :(得分:3)

urlparse.parse_qsl(和urlparse.parse_qs)是用于请求的查询部分的方法(?之后的字符串)。

也许您想要使用首先理解整个网址的方法(urlparse.urlparse),然后将结果中的查询传递给urlparse_qsl

>>> import urlparse
>>> myurl = urlparse.urlparse('https://localhost/?code=bork&charlie=brown')
>>> print myurl
ParseResult(scheme='https', netloc='localhost', path='/', params='', query='code=bork&charlie=brown', fragment='')
>>> print myurl.scheme
https
>>> print urlparse.parse_qs(myurl.query)
{'charlie': ['brown'], 'code': ['bork']}

该方案很重要,因为虽然查询存在于通用语法中,但某些协议可能不支持它们。

另见:

http://en.wikipedia.org/wiki/URI_scheme(查看官方注册的计划)

答案 1 :(得分:0)

urlparse.parse_qs(和parse_qsl)的文档确实声明“解析作为字符串参数给出的查询字符串”。你没有给它一个查询字符串,你给它整个URL。试试这个:

>>> urlparse.parse_qsl('code=bork&charlie=brown')
[('code', 'bork'), ('charlie', 'brown')]