为什么urllib.urlencode为我的dict值添加方括号和单引号?

时间:2014-02-24 18:29:31

标签: python

我正在尝试编写一个可以解析url并从中获取查询参数的脚本。到目前为止,我大部分都得到了它,但urllib.urlencode在我认为它不应该是我的值时添加方括号和单引号。这很可能是我的误解,所以如果有人能够解释为什么会发生这种情况以及如何避免它,我会非常感激。这是我的剧本:

#/usr/bin/python
import urlparse
import urllib

url = 'https://mysite.com?Action=ParseUrl'
parsed_url = urlparse.urlparse(url)
query_params = urlparse.parse_qs(parsed_url.query)

query_string = urllib.urlencode(query_params)
print query_string

结果输出为:

Action=%5B%27ParseUrl%27%5D

所以你可以看到'Action'的值被urlencoded ['']字符所包围。我希望query_string变量的值为:

Action=ParseUrl

我可以对我的脚本做些什么来实现这一目标。我意识到我可以破解某些reg exp来删除这些字符,但我宁愿理解为什么这不能按照我想要的方式工作的根本原因所以我可以在将来避免这个问题。

谢谢!

2 个答案:

答案 0 :(得分:3)

请参阅documentation notes about parse_qs(强调添加):

  

解析作为字符串参数给出的查询字符串(类型为application / x-www-form-urlencoded的数据)。数据作为字典返回。字典键是唯一的查询变量名称,每个名称的值都是列表

您可以自己确认:

>>> print query_params
{'Action': ['ParseUrl']}

请考虑使用parse_qsl。通过该更改,脚本的其余部分将按预期运行。

答案 1 :(得分:1)

您有两个选项,可让您的代码正常工作

第一个是将doseq=True传递给urllib.urlencode

import urlparse
import urllib

url = 'https://mysite.com?Action=ParseUrl'
parsed_url = urlparse.urlparse(url)
query_params = urlparse.parse_qs(parsed_url.query)

query_string = urllib.urlencode(query_params,doseq=True)
print (query_string)

输出

Action=ParseUrl

Rob Kennedy提到的第二个问题是将parse_qs替换为parseql

import urlparse
import urllib

url = 'https://mysite.com?Action=ParseUrl'
parsed_url = urlparse.urlparse(url)
query_params = urlparse.parse_qsl(parsed_url.query)

query_string = urllib.urlencode(query_params)
print (query_string)

输出

Action=ParseUrl