当前位置: 首页 > 知识库问答 >
问题:

Python 3 urllib产生TypeError:POST数据应该是字节或可迭代的字节。它不可能是类型str

包永新
2023-03-14

我试图将工作的Python 2.7代码转换成Python 3代码,我从urllib请求模块收到一个类型错误。

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

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代码:

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代码时,会产生以下错误:

---------------------------------------------------------------------------
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.

我还读了另外两张票(ticket1和ticket2),其中提到了日期编码。

当我更改行f=urllib时。要求urlopen(req)f=urllib。要求urlopen(请求编码('utf-8'))我收到以下错误:AttributeError:'Request'对象没有属性'encode'

我一直在思考如何使Python 3代码正常工作。你能帮帮我吗?

共有3个答案

澹台玉石
2023-03-14

我将python请求模块与ZOHO CRM API V2一起使用。它没有任何问题。下面是GET请求的示例工作代码:

import json
import requests

# API methods - https://www.zoho.com/crm/developer/docs/api/api-methods.html
# getrecords API Call
module_name = 'Deals'
authtoken = '*****'
api_url = "https://crm.zoho.com/crm/private/json/"+module_name+"/getRecords?authtoken="+authtoken+"&scope=crmapi&fromIndex=1&toIndex=2"

# GET Request
request_response = requests.get(
    url=api_url
    )
print(json.dumps(json.loads(request_response.text), sort_keys=True, indent=4, separators=(",", ": ")))
json_response = json.loads(request_response.text)
马业
2023-03-14

试试这个:

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

f = urllib.parse.urlencode(d)
f = f.encode('utf-8')

req = urllib.request.Request(url, f)

你的问题在于你处理字典的方式。

鲍永春
2023-03-14

从文档中可以看出,urlencode的参数输出在作为数据发送到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 2.7代码转换为Python 3代码,并且从urllib请求模块收到类型错误。 我使用内置的2to3 Python工具来转换以下工作的urllib和urllib2 Python 2.7代码: 2to3模块的输出为以下Python 3代码: 运行Python 3代码时,会产生以下错误: 我还阅读了另外两个票证(ticket1和ticket2),其中提到了对

  • 今天面试字节前端,然后面试官问我你这个项目是自己从0到1搭建的嘛?我说从网上拉下来的模板,然后他问那你对这个模板中每一个babel和plugin还有相应的loader都清楚了解嘛?我说只会常见的 虽然我知道我应该挂了,但是还是忍不住问面试官,反问的对话如下: 我:今年校招要求这么高的嘛? 面试官:今年字节对校招生的要求就是很高,希望招一个进入就能干活的,对前端充满热爱的同学 我:那如果我现在不会,

  • 问题内容: 据我了解,Java编译器生成“字节代码”,而不是“目标代码”。首先,这是正确的吗? 而且,这就是我的书所说的,我想知道为什么这是正确的。字节码和目标码有什么区别? 问题答案: 字节代码只是Java虚拟机的“目标代码”。它不是 本机 代码(例如x86)。老实说,这些天我很少听到“目标代码”一词-用更具体的术语讲通常更清晰。

  • 我是java和objectMapper的新手。我正在尝试解析json字段,该字段可能具有两种类型,它可能是字符串或数组。 例如: 或 类示例: 我使用objectMapper来反序列化json,当“full_name”字段有一个字符串时可以正常工作,但是当数组到达时,数组无法反序列化。 这个想法是,当到达一个字符串时,将值放在属性中,但当到达数组时,将数组元素连接为字符串(String.join

  • 我们计划将现有服务转移到grpc服务。因此需要将服务转换为proto定义的消息类型。在响应中,我们使用自定义对象作为键进行映射。 例如响应: 在官方文件中,他们提到, 其中key\u类型可以是任何整型或字符串类型(因此,除了浮点类型和字节之外的任何标量类型)。value\u type可以是任何类型 是否有任何替代方法来实现自定义对象键映射在原型3中?

  • 定义不可变类的策略表明 所有字段都应该是最终字段。 对于ex: 为什么一定要最终决定? 因为我没有给出setter方法吗?它不能改变。谢谢。