Python错误:类型错误:发布数据应为字节;也是用户代理问题



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

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

第二个问题,我不确定是否正确指定了我的用户代理,这是我的用户代理总体: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()

我知道这个类似的问题,typeError:发布数据应为字节或字节值。它不可能是str,但是太新了,无法得到很多帮助。

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

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

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

(强调我的)

因此,您的字符串看起来正确,您需要的是编码为字节中的字符串。然后选择编码。

binary_data = data.encode(encoding)

在上线中:编码可以是'utf-8'或'ascii',也可以是其他一堆其他东西。选择服务器期望的任何一个。

因此,您最终得到了看起来像:

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

您可以尝试将请求模块作为替代解决方案

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' : '6765Minus4181@gmail.com',
      '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()

最新更新