TypeError:POST数据应该是字节或可迭代的字节。 它不可能是str

我刚刚从Python 3.1更新到Python 3.2(格式化的HD),我的一个脚本停止工作。 它给了我标题中的错误。

我会自己修复它,但我甚至不知道什么是一个可迭代的字节是哈哈。 我试图强制字节(数据),但也没有工作。 TypeError:没有编码的string参数

url = "http://example.com/index.php?app=core&module=global&section=login&do=process" values = {"username" : USERNAME, "password" : PASSWORD} data = urllib.parse.urlencode(values) req = urllib.request.Request(url, data) urllib.request.urlopen(req) 

它在最后一行崩溃。

工作在3.1,但不是3.2

你试图将string转换成字节基本上是正确的,但你做错了。 Python没有types转换(所以你没有types转换)。

这样做的方法是将文本数据编码为字节数据,您可以使用编码function:

 binary_data = data.encode('encoding') 

什么“编码”应该取决于。 你应该在这里使用'ascii'。 如果您的字符不是ASCII,那么您需要使用另一种编码,通常是“utf8”,但是您还需要告诉接收的Web服务器它是UTF-8。 它可能也不想要UTF8,但是你必须要问它,这变得越来越复杂。 🙂

@恩德斯,我知道这是一个老问题,但我想解释一些与这个问题斗争的人的东西。

这是特别在这行代码:

 data = urllib.parse.urlencode(values) 

你有问题,因为你正在尝试编码数据:值(urlencode)。

如果您参考了urllib.parse文档,请滚动到底部以查找urlencode的作用: https ://docs.python.org/3/library/urllib.parse.html <〜您会看到您正在尝试编码用户/传入数据string:

将映射对象或可能包含str或bytes对象的两元素元组的序列转换为百分比编码的ASCII文本string。 如果生成的string将作为用于使用urlopen()函数进行POST操作的数据,则应将其编码为字节,否则将导致TypeError。

也许你在这里要做的是对你的用户/密码进行一些encryption,但是我并不认为这是正确的。 如果是这样,那么你可能需要确保接收端(你的url的目的地)知道你正在编码你的用户/通过这个。

更新的方法是使用function强大的请求库。 它们与非常常见的身份validation协议兼容: http : //docs.python-requests.org/en/master/user/authentication/

在这种情况下,我会做这样的事情:

 requests.get(url, auth=('user', 'pass'))