Python 3 urllib json AttributeError:“HTTPResponse”对象没有属性“type”
Posted
技术标签:
【中文标题】Python 3 urllib json AttributeError:“HTTPResponse”对象没有属性“type”【英文标题】:Python 3 urllib json AttributeError: 'HTTPResponse' object has no attribute 'type' 【发布时间】:2022-01-14 18:50:02 【问题描述】:我正在遍历用于构造带有 JSON 值的 url 的名称列表。我在 Python 3.x 中使用 json 和 urllib 来提取 JSON 值以用作脚本中进程的参数。第一次迭代一切正常,但之后我得到一个 TYPE 错误。
import os, sys, json, urllib.request
info1 = r"https://myurl.services"
info2 = r"/FeatureServer/info/itemInfo?f=pjson"
sList = ['servic_a', 'service_b', 'service_c']
for i in sList:
url = ''.format(info1, i, info2)
with urllib.request.urlopen(url) as url:
data = json.loads(url.read().decode())
这第一次有效,但第二次迭代给了我这个:
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "C:\Program Files\Python\envs\py3\lib\urllib\request.py", line 222, in urlopen
return opener.open(url, data, timeout)
File "C:\Program Files\Python\envs\py3\lib\urllib\request.py", line 517, in open
protocol = req.type
AttributeError: 'HTTPResponse' object has no attribute 'type'
我尝试过data.clear()
和url.close()
,但都不起作用。
【问题讨论】:
with urllib.request.urlopen(url) as url:
首先工作,因为您的网址是正确的,然后它被urllib.request.urlopen(url)
的响应覆盖,所以在下一次迭代中,它尝试执行urllib.request.urlopen(url)
,因此最终执行with urllib.request.urlopen(<your http response of previous value>) as url
.要解决此问题,请使用 with urllib.request.urlopen(url) as http_response:
之类的内容,然后使用 data = json.loads(http_response.read().decode())
谢谢。我想这是一个愚蠢的过度网站,但如果你想发布它,我会检查答案。
【参考方案1】:
在第一次迭代中,with urllib.request.urlopen(url) as url:
语句完全符合您的要求,但会用您的urllib.request.urlopen(url)
部分的响应覆盖url
变量。所以在下一次迭代中,url
是 HTTPResponseObject
和 urllib.request.urlopen()
函数得到它而不是有效的 url。
【讨论】:
以上是关于Python 3 urllib json AttributeError:“HTTPResponse”对象没有属性“type”的主要内容,如果未能解决你的问题,请参考以下文章
使用 Python 获取标头并转换为 JSON(请求 - urllib2 - json)
用于关闭 impala 查询的 Python 脚本。我正在使用 urllib 和 json 库
python Python3の的urllibでとあるAPIからJSONを取得したいのですが,そのAPIが高频度で502を返すため的urlopen()をリトライする実装を工夫しています.urllib3は