使用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())
再补充下修改的逻辑:
- urllib3的正确姿势:urllib3是为高效的连接池设计的,必须先实例化
PoolManager,再用它的request()方法发送请求,这和你习惯的urllib.request.urlopen完全不同 - 响应内容解码:
response.data返回的是原始字节流,解码成字符串后存入字典,后续查看或处理会更方便 - 输入类型匹配:
input()返回的永远是字符串,所以判断用户输入时要和字符串'1'比较,否则逻辑会一直走else分支
这样修改后,你的程序应该就能正常运行,不会再触发AttributeError了。
内容的提问来源于stack exchange,提问作者Luis F Llano
相关产品推荐
相关产品推荐

