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

时间:2011-03-26 05:23:23

标签: python-3.x

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

我会自己修复它,但我甚至不知道可迭代的字节是多少。我尝试了类型转换字节(数据),但这也没有用。 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)

它在最后一行崩溃。

适用于3.1,但不适用于3.2

2 个答案:

答案 0 :(得分:45)

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

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

binary_data = data.encode('encoding')

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

答案 1 :(得分:9)

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

这里特别使用这行代码:

data = urllib.parse.urlencode(values)

当您尝试对数据进行编码时,您遇到了问题:值(urlencode)。

如果您参考urllib.parse文档滚动到底部以查找urlencode的作用:https://docs.python.org/3/library/urllib.parse.html<〜您将看到您正在尝试将您的用户/传递编码为数据字符串:

  

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

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

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

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

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