我刚刚从python 3.1更新到python 3.2(格式化HD),我的一个脚本停止工作.它给了我标题中的错误.
我会自己修复它,但我甚至不知道什么是可迭代的字节是lol.我尝试了类型转换字节(数据),但这也没有用.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)
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,但是你必须要问它,而且它变得越来越复杂.:-)
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)
| 归档时间: |
|
| 查看次数: |
46199 次 |
| 最近记录: |