Python 3 urllib 产生 TypeError: POST data should be bytes or an iterable of bytes.它不能是 str 类型 [英] Python 3 urllib produces TypeError: POST data should be bytes or an iterable of bytes. It cannot be of type str

查看:166
本文介绍了Python 3 urllib 产生 TypeError: POST data should be bytes or an iterable of bytes.它不能是 str 类型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试将可用的 Python 2.7 代码转换为 Python 3 代码,但我收到来自 urllib 请求模块的类型错误.

I am trying to convert working Python 2.7 code into Python 3 code and I am receiving a type error from the urllib request module.

我使用内置的 2to3 Python 工具来转换以下工作 urllib 和 urllib2 Python 2.7 代码:

I used the inbuilt 2to3 Python tool to convert the below working urllib and urllib2 Python 2.7 code:

import urllib2
import urllib

url = "https://www.customdomain.com"
d = dict(parameter1="value1", parameter2="value2")

req = urllib2.Request(url, data=urllib.urlencode(d))
f = urllib2.urlopen(req)
resp = f.read()

2to3 模块的输出是以下 Python 3 代码:

The output from the 2to3 module was the below Python 3 code:

import urllib.request, urllib.error, urllib.parse

url = "https://www.customdomain.com"
d = dict(parameter1="value1", parameter2="value2")

req = urllib.request.Request(url, data=urllib.parse.urlencode(d))
f = urllib.request.urlopen(req)
resp = f.read()

运行 Python 3 代码时,会产生以下错误:

When the Python 3 code is run the following error is produced:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-56-206954140899> in <module>()
      5 
      6 req = urllib.request.Request(url, data=urllib.parse.urlencode(d))
----> 7 f = urllib.request.urlopen(req)
      8 resp = f.read()

C:\Users\Admin\Anaconda3\lib\urllib\request.py in urlopen(url, data, timeout, cafile, capath, cadefault, context)
    159     else:
    160         opener = _opener
--> 161     return opener.open(url, data, timeout)
    162 
    163 def install_opener(opener):

C:\Users\Admin\Anaconda3\lib\urllib\request.py in open(self, fullurl, data, timeout)
    459         for processor in self.process_request.get(protocol, []):
    460             meth = getattr(processor, meth_name)
--> 461             req = meth(req)
    462 
    463         response = self._open(req, data)

C:\Users\Admin\Anaconda3\lib\urllib\request.py in do_request_(self, request)
   1110                 msg = "POST data should be bytes or an iterable of bytes. " \
   1111                       "It cannot be of type str."
-> 1112                 raise TypeError(msg)
   1113             if not request.has_header('Content-type'):
   1114                 request.add_unredirected_header(

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

我还阅读了另外两张票(ticket1ticket2),其中提到了对日期进行编码.

I have also read two other tickets (ticket1 and ticket2) which mentioned encoding the date.

当我将 f = urllib.request.urlopen(req) 更改为 f = urllib.request.urlopen(req.encode('utf-8')) 时 我收到以下错误:AttributeError: 'Request' object has no attribute 'encode'

When I changed the line f = urllib.request.urlopen(req) to f = urllib.request.urlopen(req.encode('utf-8')) I received the following error: AttributeError: 'Request' object has no attribute 'encode'

我不知道如何使 Python 3 代码工作.你能帮我吗?

I am stuck as to how to make the Python 3 code work. Could you please help me?

推荐答案

来自 docs 请注意,urlencode 的 params 输出在作为数据发送到 urlopen 之前被编码为字节:

data = urllib.parse.urlencode(d).encode("utf-8")
req = urllib.request.Request(url)
with urllib.request.urlopen(req,data=data) as f:
    resp = f.read()
    print(resp)

这篇关于Python 3 urllib 产生 TypeError: POST data should be bytes or an iterable of bytes.它不能是 str 类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆