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

End*_*ers 36 python-3.x

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

我会自己修复它,但我甚至不知道什么是可迭代的字节是lol.我尝试了类型转换字节(数据),但这也没有用.TypeError:没有编码的字符串参数

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)
Run Code Online (Sandbox Code Playgroud)

它在最后一行崩溃了.

适用于3.1,但不适用于3.2

Len*_*bro 47

你在尝试将字符串转换为字节时基本上是正确的,但是你做错了.Python没有类型转换(所以你做的不是类型转换).

这样做的方法是将文本数据编码为字节数据,使用编码功能:

binary_data = data.encode('encoding')
Run Code Online (Sandbox Code Playgroud)

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

  • 这是一个很好的答案,但我认为如果它包含更正的代码可以改进.目前还不清楚数据来自哪里以及提供binary_data的位置. (15认同)

ntk*_*tk4 10

@Enders,我知道这是一个老问题,但我想为那些与这个问题作斗争的人解释一些事情.

具体来说,这行代码在这里:

data = urllib.parse.urlencode(values)
Run Code Online (Sandbox Code Playgroud)

您正在尝试对数据进行编码时遇到问题:值(urlencode).

如果你参考urllib.parse文档滚动到底部找到urlencode的作用:https://docs.python.org/3/library/urllib.parse.html <〜你会看到你正在尝试编码你的user /传入数据字符串:

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

也许您在这里尝试做的是对您的用户/密码进行某种加密,但我并不认为这是正确的方法.如果是,那么您可能需要确保接收端(您的网址的目的地)知道您正在使用此编码您的用户/通行证.

更新的方法是使用功能强大的Requests库.它们与非常常见的身份验证协议兼容:http://docs.python-requests.org/en/master/user/authentication/

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

requests.get(url, auth=('user', 'pass'))
Run Code Online (Sandbox Code Playgroud)