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(&lt;your http response of previous value&gt;) 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 变量。所以在下一次迭代中,urlHTTPResponseObjecturllib.request.urlopen() 函数得到它而不是有效的 url。

【讨论】:

以上是关于Python 3 urllib json AttributeError:“HTTPResponse”对象没有属性“type”的主要内容,如果未能解决你的问题,请参考以下文章

使用 Python 获取标头并转换为 JSON(请求 - urllib2 - json)

用于关闭 impala 查询的 Python 脚本。我正在使用 urllib 和 json 库

json 使用attr的Python类

python Python3の的urllibでとあるAPIからJSONを取得したいのですが,そのAPIが高频度で502を返すため的urlopen()をリトライする実装を工夫しています.urllib3は

Python2/3中的urllib库

python_接口