鬼少 发表于 2024-11-23 23:05:55

使用 urllib.parse.urlencode().encode('utf-8')报错的问题

import urllib.parse

data = {
            'i': content,
            'from': 'AUTO',
            'to': 'AUTO',
            'smartresult': 'dict',
            'client': 'fanyideskweb',
            # 时间戳1970秒
            'salt':salt,
            # 加密
            'sign': sign,
            # 时间戳
            'lts': lts,
            # 加密的数据
            'bv': 'f0819a82107e6150005e75ef5fddcc3b',
            'doctype': 'json',
            'version': '2.1',
            'keyfrom': 'fanyi.web',
            'action': 'FY_BY_REALTlME',
                }
                  

当执行代码的时候:

>>>data = urllib.parse.urlencode(data)
                  
>>>print(data)
                  
>>>i=q%21&from=AUTO&to=AUTO&smartresult=dict&client=fanyideskweb&salt=1732373450894&sign=94d4ca6e41189939dabf53bba271d0f8&lts=173237345089&bv=f0819a82107e6150005e75ef5fddcc3b&doctype=json&version=2.1&keyfrom=fanyi.web&action=FY_BY_REALTlME

>>>type(data)
                  
>>><class 'str'>

//执行如下程序时, 报错误,请问时什么原因呢?谢谢
>>>data = urllib.parse.urlencode(data).encode('utf-8')
                  
Traceback (most recent call last):
File "D:\program\Python\Python312\Lib\urllib\parse.py", line 984, in urlencode
    raise TypeError
TypeError

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
File "<pyshell#37>", line 1, in <module>
    data = urllib.parse.urlencode(data).encode('utf-8')
File "D:\program\Python\Python312\Lib\urllib\parse.py", line 990, in urlencode
    raise TypeError("not a valid non-string sequence "
TypeError: not a valid non-string sequence or mapping object

FishC 发表于 2024-11-23 23:10:09

在使用 `urllib.parse.urlencode()` 时遇到的错误通常与传递给 `urlencode` 的数据不符合正确的格式有关。根据您提供的代码和错误信息,可以看到您在将 `data` 字典编码为 URL 查询字符串后,又试图对结果进行 `.encode('utf-8')` 操作。这导致了 TypeError,因为 `urlencode` 返回的是一个字符串,字符串对象上没有再进行 `.encode('utf-8')` 的必要。

下面是您的问题解答:

1. `urllib.parse.urlencode(data)` 返回的已经是一个字符串,代表编码后的 URL 查询字符串。

2. `str.encode('utf-8')` 通常用于将字符串转换为字节对象。如果需要字节对象,可以在代码中调整顺序:首先用 `urlencode` 编码为字符串,然后再编码为字节。

正确的步骤应该是:

data_string = urllib.parse.urlencode(data)   # 先将字典编码成查询字符串
data_bytes = data_string.encode('utf-8')   # 然后将字符串编码为字节对象

根据以上说明,问题可以通过使用 `data_bytes` 来处理字节版本的编码数据。这种转换顺序在用于 HTTP 请求时(例如,POST 请求的请求体数据)是很常见的。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 使用 urllib.parse.urlencode().encode('utf-8')报错的问题