我刚刚从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中工作
- 2021-1-111 #
- 2021-1-112 #
@Enders,我知道这是一个古老的问题,但是我想为与这个问题作斗争的人解释一些其他问题.
此处特别是此行代码:
data = urllib.parse.urlencode(values)
您在尝试编码数据时遇到问题:值(urlencode).
如果您参考urllib.parse文档,请滚动至底部以找到urlencode的作用:https://docs.python.org/3/library/urllib.parse.html<〜您将看到您正在尝试 将您的用户/密码编码为数据字符串:
Convert a mapping object or a sequence of two-element tuples, which may contain str or bytes objects, to a percent-encoded ASCII text string. If the resultant string is to be used as a data for POST operation with the urlopen() function, then it should be encoded to bytes, otherwise it would result in a TypeError.
也许您在此处尝试对用户/密码进行某种形式的加密,但是我真的不认为这是正确的方法.如果是这样,那么您可能需要确保接收端(URL的目的地)知道您正在使用此编码用户/密码.
一种最新的方法是使用功能强大的请求库.它们与非常常见的身份验证协议兼容:http://docs.python-requests.org/en/master/user/authentication/
在这种情况下,我会这样做:
requests.get(url, auth=('user', 'pass'))
您在将字符串转换为字节方面基本上是正确的,但是这样做的方式是错误的. Python没有类型转换(因此您没有进行类型转换)。
做到这一点的方法是将文本数据编码为字节数据,您可以使用编码功能:
什么是"编码"取决于.您可能应该在此处使用" ascii".如果您使用的字符不是ASCII,则需要使用另一种编码,通常是'utf8',但同时还需要告诉接收方网络服务器它是UTF-8.它可能也不想要UTF8,但是随后您必须要问它,并且它变得越来越复杂. :-)