2012-11-01 24 views
9

Sử dụng đoạn mã sau tôi nhận được một lỗi:Lỗi Python: Lỗi loại: Dữ liệu POST phải là byte; cũng user-agent vấn đề

TypeError: POST data should be bytes or an iterable of bytes. It cannot be str 

Thứ hai mối quan tâm, tôi không chắc chắn nếu tôi đã chỉ định user-agent của tôi một cách chính xác, đây là user-agent của tôi trong toàn bộ: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4. Tôi đã chụp tốt nhất khi tôi xác định tác nhân người dùng trong tập lệnh.

import urllib.parse 
import urllib.request 

url = 'http://getliberty.org/contact-us/' 
user_agent = 'Mozilla/5.0 (compatible; Chrome/22.0.1229.94; Windows NT)' 
values = {'Your Name' : 'Horatio', 
      'Your Email' : '[email protected]', 
      'Subject' : 'Hello', 
      'Your Message' : 'Cheers'} 

headers = {'User-Agent': user_agent } 

data = urllib.parse.urlencode(values) 
req = urllib.request.Request(url, data) 
response = urllib.request.urlopen(req) 
the_page = response.read() 

Tôi biết câu hỏi tương tự này, TypeError: POST data should be bytes or an iterable of bytes. It cannot be str nhưng quá mới để có câu trả lời giúp đỡ nhiều.

Trả lời

17
data = urllib.parse.urlencode(values) 
type(data) #this returns <class 'str'>. it's a string 

Các tài liệu urllib nói cho urllib.request.Request(url, data ...):

The urllib.parse.urlencode() function takes a mapping or sequence of 2-tuples and returns a string in this format. It should be encoded to bytes before being used as the data parameter. etc etc

(tôi nhấn mạnh)

Vì vậy, bạn có một chuỗi mà có vẻ đúng, những gì bạn cần là chuỗi mã hóa vào byte. Và bạn chọn mã hóa.

binary_data = data.encode(encoding) 

trong dòng trên: mã hóa có thể là 'utf-8' hoặc 'ascii' hoặc một số thứ khác. Chọn bất kỳ máy chủ nào mong đợi.

Vì vậy, bạn kết thúc với cái gì đó trông giống như:

data = urllib.parse.urlencode(values) 
binary_data = data.encode(encoding) 
req = urllib.request.Request(url, binary_data) 
2

Bạn có thể thử với module yêu cầu như một giải pháp thay thế

import json 
import requests 

url = 'http://getliberty.org/contact-us/' 
user_agent = 'Mozilla/5.0 (compatible; Chrome/22.0.1229.94; Windows NT)' 
values = { 
     'Your Name' : 'Horatio', 
     'Your Email' : '[email protected]', 
     'Subject' : 'Hello', 
     'Your Message' : 'Cheers' 
     } 

headers = {'User-Agent': user_agent, 'Content-Type':'application/json' } 

data = json.dumps(values) 
request = requests.post(url, data=data, headers=headers) 

response = request.json() 
Các vấn đề liên quan