鱼C论坛

 找回密码
 立即注册
查看: 120|回复: 1

[已解决]使用 urllib.parse.urlencode().encode('utf-8')报错的问题

[复制链接]
发表于 2024-11-23 23:05:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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
最佳答案
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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-31 02:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表