Python错误:输入错误:POST数据应为字节; 还有用户代理问题

Tyl*_*ler 10 post python-3.x

使用以下代码我收到一个错误:

TypeError: POST data should be bytes or an iterable of bytes. It cannot be str
Run Code Online (Sandbox Code Playgroud)

第二个问题,我不确定我是否正确指定了我的用户代理,这里是我的用户代理:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4.当我在脚本中定义用户代理时,我给了我最好的镜头.

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' : '6765Minus4181@gmail.com',
          '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()
Run Code Online (Sandbox Code Playgroud)

我知道这个类似的问题,TypeError:POST数据应该是字节或可迭代的字节.它不可能是str,但是对于答案来说太新了太多帮助.

She*_*ena 18

data = urllib.parse.urlencode(values)
type(data) #this returns <class 'str'>. it's a string
Run Code Online (Sandbox Code Playgroud)

urllib文档说urllib.request.Request(url, data ...):

urllib.parse.urlencode()函数采用2元组的映射或序列,并以此格式返回一个字符串.在用作数据参数之前,应将其编码为字节.等等

(强调我的)

所以你有一个看起来正确的字符串,你需要的是编码成字节的字符串.然后你选择编码.

binary_data = data.encode(encoding)
Run Code Online (Sandbox Code Playgroud)

在上面一行:编码可以是'utf-8'或'ascii'或其他一些东西.选择服务器所期望的任何一个.

所以你最终得到的东西看起来像:

data = urllib.parse.urlencode(values)
binary_data = data.encode(encoding) 
req = urllib.request.Request(url, binary_data)
Run Code Online (Sandbox Code Playgroud)