![](/img/trans.png)
[英](Short) - POST data should be bytes or an iterable of bytes. It cannot be of type str
[英]POST data should be bytes or an iterable of bytes. It cannot be of type str
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()
再次關閉響應對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.