python - POST 数据应该是字节或字节的可迭代对象。它不能是 str 类型

标签 python python-3.x

def login(self):
    url = 'https://login.facebook.com/login.php?login_attempt=1'
    data = "locale=en_US&non_com_login=&email="+self.email+"&pass="+self.password+"&lsd=20TOl"
    usock = self.opener.open('http://www.facebook.com')
    usock = self.opener.open(url, data)
    if "Logout" in usock.read():
        print("Logged in.")
    else:
        print("failed login")
        print(usock.read())
        sys.exit()

您能告诉我错误是如何发生的吗?

POST 数据应该是字节或字节的可迭代对象。它不能是 str 类型。

最佳答案

您的数据是一个字符串,但 urllib 要求它是一个 bytes 对象,因为它以原始形式发送,没有编码信息。您有两种方法可以解决此问题:

通过调用 str.encode 将字符串转换为字节对象。默认情况下,这将使用 UTF8 编码,因此它应该适用于大多数服务器:

usock = self.opener.open(url, data.encode())

另一种方法是直接以字节为单位指定数据。要创建字节字符串,只需在文字前面添加 b:

data = b"This is some bytes data"

由于您在这里连接不同的内容,因此第一个选项更容易,因为您不需要对连接字符串的每个部分进行编码。

顺便说一句。您正在调用 opener.open 两次,一次没有数据,一次有数据。您可能应该删除第一个调用;当然,除非您想收集一些初始 cookie 或其他内容,在这种情况下您至少应该使用 usock.close() 再次关闭响应对象。

关于python - POST 数据应该是字节或字节的可迭代对象。它不能是 str 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28850421/

相关文章:

python - 多元回归的高斯总和

python - 使用python在数据框中的某些列中删除具有相同值的行

python - 将 opengl 缓冲区写入视频的工件

python - Pyqt QTablewidget 自动换行

python - Beautiful Soup 不返回 html 表的列表

python-3.x - 计算 Pandas 中的条件均值

python - 如何在 python run_in_executor 方法调用中捕获异常

文件中的 Python ElementTree.parse() 不会关闭文件

Python 函数在类定义之外赋值会导致参数异常

python - 是否有独立于数据库的方法来过滤 "None"/"NaN"?