【问题标题】:Python 3 urllib json AttributeError: 'HTTPResponse' object has no attribute 'type'Python 3 urllib json AttributeError:“HTTPResponse”对象没有属性“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())
  • 谢谢。我想这是一个愚蠢的过度网站,但如果你想发布它,我会检查答案。

标签: json python-3.x urllib


【解决方案1】:

在第一次迭代中,with urllib.request.urlopen(url) as url: 语句完全符合您的要求,但会用您的urllib.request.urlopen(url) 部分的响应覆盖url 变量。所以在下一次迭代中,urlHTTPResponseObjecturllib.request.urlopen() 函数得到它而不是有效的 url。

【讨论】:

    猜你喜欢
    • 2016-09-19
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 2011-09-26
    • 1970-01-01
    • 2020-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多