如何urllib.urlencode数组中的字典?

时间:2016-04-15 07:15:03

标签: python urllib urlencode

我试图对此参数进行urlencode:

params = {
                              "attachments": [
                                  {
                                      "title": "output.title",
                                      "text": "output.text",
                                  }
                              ]}

urllib.urlencode(params, True)

这就是我得到的:

attachments=%7B%27text%27%3A+%27output.text%27%2C+%27title%27%3A+%27output.title%27%7D

这就是我所期待的:

attachments=%5B%7B%22text%22%3A%20%22output.text%22%2C%20%22title%22%3A%22output.title%22%7D%5D

更新:

我注意到,如果我禁用dosec,我会得到更接近我需要的东西。

urllib.urlencode(params)

attachments=%5B%7B%27text%27%3A+%27output.text%27%2C+%27title%27%3A+%27output.title%27%7D%5D

但仍有差异%22%vs%27%

2 个答案:

答案 0 :(得分:1)

%22是双引号("),而%27是简单引用(')。并且urllib.urlencode只是编码字典或两元素元组的序列。

所以这里你的词典以attachement为关键词,并且下面的词典列表为值:

                   val = [
                              {
                                  "title": "output.title",
                                  "text": "output.text",
                              }
                          ]

但对于python,该列表是一个字符串,因此它将其表示形式用作字符串(使用简单的引号):

>>> str(val)
[{'text': 'output.text', 'title': 'output.title'}]

然后urlencode该字符串。如果你想要双引号兼容Json,你应该使用json模块:

>>> json.dumps(val)
'[{"text": "output.text", "title": "output.title"}]'

最后它会给出:

>>> urllib.urlencode({ k: json.dumps(v) for k,v in params.iteritems() })
'attachments=%5B%7B%22text%22%3A+%22output.text%22%2C+%22title%22%3A+%22output.title%22%7D%5D'

这是你所期望的(除了项目的顺序,但字典是一个哈希,不维护顺序 - 如果你需要订单,使用一系列对)

答案 1 :(得分:0)

Python字典类型,如下所示,

>>> params = {
...                               "attachments": [
...                                   {
...                                       "title": "output.title",
...                                       "text": "output.text",
...                                   }
...                               ]}
>>> print params
{'attachments': [{'text': 'output.text', 'title': 'output.title'}]}

urllib.urlencode转义那些字符串。所以你得到“%27”这是单引号的html转义字符。

但你想逃到“%22”(双引号)。

如果您需要,那么您不必直接使用urlencode。

尝试使用json转储并对每个项目进行编码。

像,

import urllib
import json


def myencode(dic):
    return urllib.urlencode({d: json.dumps(dic[d]) for d in dic})

params = {
                              "attachments": [
                                  {
                                      "title": "output.title",
                                      "text": "output.text",
                                  }
                              ]}

urllib.urlencode(params, True)

myencode(params)