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

How to urllib.urlencode a dictionary within an array?

我正在尝试对这个参数进行 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% 与 %27% 的差异

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)

嗯,%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'

这是您所期望的(除了项目的顺序,但字典是一个散列并且不维护顺序 - 如果您需要顺序,请使用成对的序列)