如何 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'
这是您所期望的(除了项目的顺序,但字典是一个散列并且不维护顺序 - 如果您需要顺序,请使用成对的序列)
我正在尝试对这个参数进行 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'
这是您所期望的(除了项目的顺序,但字典是一个散列并且不维护顺序 - 如果您需要顺序,请使用成对的序列)