2012-11-01 11 views
9

Korzystanie poniższy kod otrzymałem błąd:Błąd w języku Python: błąd typu: dane POST powinny być bajtami; również user-agent emisji

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

II obaw, nie jestem pewien, czy określony moje user-agent poprawnie, oto moja user-agent w całości: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4. Dałem z siebie wszystko, jak zdefiniowałem agenta użytkownika w skrypcie.

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() 

Zdaję sobie sprawę z tego, TypeError: POST data should be bytes or an iterable of bytes. It cannot be str podobne pytanie, ale jestem zbyt nowe dla odpowiedź będzie znacznie pomóc.

Odpowiedz

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

Docs urllib powiedzieć 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

(Kopalnia nacisk)

Więc masz ciąg znaków, który wygląda dobrze, co potrzebne jest, że ciąg zakodowany w bajtach. I wybierasz kodowanie.

binary_data = data.encode(encoding) 

w powyższym wierszu: kodowanie może być "utf-8" lub "ascii" lub pęczkiem innych rzeczy. Wybierz tę, której oczekuje serwer.

więc skończyć z czymś, co wygląda jak:

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

Można spróbować z modułem żądań jako alternatywnego rozwiązania

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() 
Powiązane problemy