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

时间:2015-03-04 09:09:14

标签: 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类型。

1 个答案:

答案 0 :(得分:1)

您的数据是一个字符串,但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()关闭响应对象。