urllib.request库遇到HTTP错误时如何跳过异常继续遍历URL?
问题原因
- 报错的核心逻辑问题:
page.read()和page.close()写在了所有逻辑分支外,当URL请求触发异常时,page还是初始赋值的None,调用不存在的read方法自然会触发AttributeError。 - 原有代码没有做「请求成功才处理页面内容」的逻辑限制,失败请求也会走读取步骤,导致整个爬取中断。
修正方案
把页面读取、关闭的逻辑挪到else分支即可,else分支只有在try块没有抛出任何异常时才会执行,刚好满足「请求成功才处理页面,出错直接跳过继续爬下一个URL」的需求。
修正后的完整代码如下:
import urllib.request as ur httpErrors = 0 # 此处替换为你自己的URL列表 url_List = [] for i in url_List: website = ur.Request(i, data=None, headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36'}) page = None try: page = ur.urlopen(website) except Exception as e: print(f"URL {i} 访问出错:{e}") httpErrors += 1 else: print(f"URL {i} 访问成功") # 仅请求成功时才执行读取、关闭操作 data = page.read() page.close() # 此处可添加你后续的文本处理逻辑,比如存储内容、解析字段等 finally: print('累计HTTP错误数:' + str(httpErrors))
额外优化说明:如果需要后续重试失败的URL,可以额外定义一个错误列表,在except分支把出错的URLi追加到列表中,爬取完成后单独处理即可。
内容的提问来源于stack exchange,提问作者sanminchui
相关产品推荐
相关产品推荐

