将x-www-form-urlencoded查询字符串转换为字典

3 投票
2 回答
1960 浏览
提问于 2025-04-16 22:32

给定一个来自 x-www-form-urlencoded 表单数据的查询字符串。

data[foo]=bar&data[bar]=baz

我想把它转换成一个 Python 字典,比如说:

{'data': {'foo': 'bar', 'bar': 'baz'}}

或者类似这样的结构。基本上,我希望它能像 PHP 的 $_POST 变量那样处理这些表单数据:

Array
(
    [data] => Array
        (
            [foo] => bar
            [bar] => baz
        )

)

但是 urlparse.parse_qs() 只给我:

{'data[bar]': ['baz'], 'data[foo]': ['bar']}

这也不是世界末日。我可以很容易地通过 data[bar] 或其他方式来调用字典里的值。我只是有点惊讶,居然没有一个模块可以执行这种解析,至少我没有找到。有没有人知道有这样的模块吗?

附加问题:有没有可能是某种原因导致 Python 中没有这样的库,比如说 PHP 将表单数据转换成多层数组的方式不太对?

2 个回答

-3
  • PHP会自动把表单中的索引变量解码成多层数组。PHP文档
  • 这是PHP的一个特性,并不是HTTP或网页的标准。
  • 因为在HTTP的标准文档中,并没有定义一个通用的“数组”结构。
  • 而且,使用[]或者其他非字母数字的字符作为键名,真的是个坏习惯。

所以,我们最好还是使用简单的键=值格式。

  • 或者尝试用用户自定义的数据格式来编码/解码多层数组(就像PHP那样),这样在客户端和服务器端都能用。
  • 如果你提供一个使用这种用户自定义格式的HTTP接口,你就得给客户解释很多东西。
0

目前我正在用这个方法手动把它转换成真正的 Python dict。不过,可能还有一些我还没遇到的未知问题。

from urllib.parse import parse_qs

str_raw_data = str(bytes_raw_data, 'utf-8')   # bytes to string

formatted_data_dict = parse_qs(str_raw_data)
data = {}
for k, v in formatted_data_dict.items():
    if len(v) == 1:
        data[k] = v[0]
    else:
        data[k] = v

return data

撰写回答