【问题标题】:Convert Python(2.7) dictionary to valid query params将 Python(2.7) 字典转换为有效的查询参数
【发布时间】:2018-06-14 01:05:43
【问题描述】:

所以到目前为止,我一直在环顾四周,并找到了热门歌曲,但没有什么能完全符合 IMO 的要求。我想要做的是使用一个名为“result”的 Python 字典(请注意,“keyword_scores”是一个字典列表,位于“data”字典中。):

>>> print result
>>> {   
        u'data': {   
            u'clean_table': u'true',
            u'keyword_scores': [   
                {   
                    u'keyword': u'edited for easy reading on SO',
                    u'score': 0.4054651081081644
                }
            ],
            u'user_id': u'2'
        }
    }

而且,至少我认为,使用某种组合

urllib.urlencode()

urlparse.parse_qs()

能够将“query_string”连接到 URL 上以供内部使用:

urllib2.Request(host_domain + some_post_data_endpoint + query_string)

我只推荐这些库,因为根据我目前的搜索,我认为我需要使用这些库,但我对在这里使用的方法和工具持开放态度。我遇到的问题是,无论出于何种原因,我似乎需要在调用 parse_qs() 之前对其进行 urlencode(),但其他建议说我需要在编码之前先调用 parse_qs()。似乎没有一种简洁的方法可以将不完全“扁平”的字典转换为 urllib2.Request() 使用的查询参数。

提前谢谢你!

【问题讨论】:

  • 您只需要查询字符串中的keyword_scores吗?您能否在此示例中提供您想要的示例查询字符串?
  • 我认为这是正确的问题,我无法为 urllib2.Request() 创建正确编码的查询字符串来处理,因为我要发送的数据在外部字典中有列表/字典。用所有的替换词打出来不会很有用(除非我误解了你)。
  • 好的,只是想了解问题所在。我已经试了一下并在下面发布并回答。如果您想要将结果字典传递给您的端点,我认为您不需要 parse_qs。

标签: python-2.7 urllib2 urllib urlencode urlparse


【解决方案1】:

我假设您有一些要向其发布数据的端点。然后您可以执行以下操作并在端点解码 url:

import urllib
result = {u'data': {u'clean_table': u'true',u'keyword_scores': [{u'keyword': u'edited for easy reading on SO', u'score': 0.4054651081081644}],u'user_id': u'2'}}
result_string = urllib.urlencode(result)
urllib2.Request(host_domain + some_post_data_endpoint + "?result=" + result_string)

例如,如果您的端点是 JS,您只需执行以下操作即可将结果作为同一个字典:

var url = new URL(window.location.href);
var result = JSON.parse(url.searchParams.get("result"));

【讨论】:

  • 感谢您的帮助。我想通了:我有点作弊,在 Postman 中找到了完整请求的 Python 版本,并查看了它是如何对 URL 进行编码并努力复制它的。我会尽快发布解释...
【解决方案2】:

我解决这个问题的方法是利用 Postman 来了解它是如何对 URL 进行编码的,同时也切换到使用 requests 库而不是 urllib2/urllib。

类似:

raw_json = json.dumps(result)
encoded_json = urllib.quote(raw_json)
tmp = Template("data=$d")
# request will look like encoded nonsense like "data=%7B%22clean_table%22%3A%20true%2C%20%22keyword_scores%22%3A%20%5B%7B%22score%22%3A%200.4054651081081644%2C%20%22keyword%22%3A%20%22bruins%22%7D%5D%2C%20%22user_id%22%3A%20%222%22%7D"
request = tmp.substitute(d=encoded_json)
headers = {
    'Content-Type': "application/x-www-form-urlencoded"
}
response = requests.request("POST", url, data=request, headers=headers)

注意:headers 参数是必需的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-30
    • 2016-12-05
    • 1970-01-01
    • 2023-01-04
    • 2021-08-21
    • 1970-01-01
    • 2014-07-28
    • 2017-07-21
    相关资源
    最近更新 更多