You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用urllib3下载网页存入字典触发AttributeError问题求助

解决urllib3使用中的AttributeError问题

嘿,你的问题我看明白了——触发AttributeError的核心原因是urllib3的使用方式不对,它和Python标准库的urllib.request用法不一样,没有直接的urlopen()函数可以调用。另外代码里还有个小细节错误,我一起帮你修正。

先拆解下问题点:

  • 你直接调用urllib3.urlopen(),但这个函数在urllib3库中根本不存在,这就是报错的根源
  • 代码里判断stopOrProceed ==1时,input()返回的是字符串类型,和整数1永远无法匹配,这个逻辑会失效

下面是保留了你作业注释的修正版代码,关键修改处我标出来了:

#下载网页
import urllib3
import sys
#这些导入语句让我们可以使用“模块”(又称“库”)——即他人编写的可复用代码
urlToRead = 'http://www.google.com'
#这个值实际不会被使用,因为下方while循环的设置方式。但while循环通常需要这样一个初始值来保证首次执行正常
crawledWebLinks = {}
#初始化一个空字典,其中键值对对应(简称,网页内容),例如("Google" , "网页HTML内容")
#接下来是一个while循环
#初始化部分结束
while urlToRead != ' ':
    #这是while循环的执行条件:只要该条件为真,循环持续执行;条件为假时停止
    try:
        urlToRead = input("请输入下一个要爬取的URL:")
        #try块用于防止程序因错误崩溃,若出现错误则跳转到except块执行
        if urlToRead == '':
            print ("好的,退出循环")
            break
        #若用户输入为空,则退出循环
        shortName = input("请为URL " + urlToRead + "输入一个简称:")
        
        # --- 核心修改部分开始 ---
        # urllib3基于连接池,必须先创建PoolManager实例
        http = urllib3.PoolManager()
        # 用request方法发起GET请求,获取响应对象
        response = http.request('GET', urlToRead)
        # 将字节类型的响应内容解码为字符串(方便后续查看和使用)
        webFile = response.data.decode('utf-8')
        # --- 核心修改部分结束 ---
        
        crawledWebLinks[shortName] = webFile
        #上述代码行将(简称,对应URL的HTML内容)键值对存入字典
    except:
        #若try块中的代码触发错误,则执行except块下的缩进代码,这是异常处理的示例
        print ("*************\n意外错误*****", sys.exc_info()[0])
        #sys.exc_info()[0]会返回最近一次错误的相关信息,该功能由我们导入的sys库提供
        stopOrProceed = input("嗯...是否继续?输入1停止,输入其他内容继续:")
        # 这里把整数1改成字符串'1',因为input返回的是字符串类型
        if stopOrProceed == '1' :
            print ('好的...正在停止\n')
            break
        #该break语句会跳出最近的循环,此处即while循环
        else:
            print ("好的!继续执行\n")
            continue
        #该continue语句会跳过当前循环迭代,进入下一次循环,即循环回到起始位置
print (crawledWebLinks.keys())

再补充下修改的逻辑:

  1. urllib3的正确姿势:urllib3是为高效的连接池设计的,必须先实例化PoolManager,再用它的request()方法发送请求,这和你习惯的urllib.request.urlopen完全不同
  2. 响应内容解码:response.data返回的是原始字节流,解码成字符串后存入字典,后续查看或处理会更方便
  3. 输入类型匹配:input()返回的永远是字符串,所以判断用户输入时要和字符串'1'比较,否则逻辑会一直走else分支

这样修改后,你的程序应该就能正常运行,不会再触发AttributeError了。

内容的提问来源于stack exchange,提问作者Luis F Llano

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:39:12