我刚刚从python 3.1更新到python 3.2(格式化HD),我的一个脚本停止工作。它给了我标题中的错误。
我会自己修复它,但我甚至不知道可迭代的字节是多少。我尝试了类型转换字节(数据),但这也没有用。 TypeError:不带编码的字符串参数
url = "http://example.com/index.php?app=core&module=global§ion=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
答案 0 :(得分:45)
你在尝试将字符串转换为字节时基本上是正确的,但是你做错了。 Python没有类型转换(所以你所做的不是类型转换)。
这样做的方法是将文本数据编码为字节数据,使用编码函数进行编码:
binary_data = data.encode('encoding')
'编码'应该取决于什么。你应该在这里使用'ascii'。如果你的字符不是ASCII,那么你需要使用另一种编码,通常是“utf8”,但是你还需要告诉接收网络服务器它是UTF-8。它可能也不想要UTF8,但是你必须要问它,而且它变得越来越复杂。 : - )
答案 1 :(得分:9)
这里特别使用这行代码:
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'))