Python爬取网页做离线异常处理时遇urllib未解析引用报错如何解决
问题根因
你现在遇到的捕获失败问题,本质是Python的导入作用域规则和你写的导入代码不匹配:
- 原代码的导入语句是
from urllib.request import Request, urlopen,这种写法只会把urllib.request模块里指定的Request、urlopen两个对象绑定到当前文件的命名空间,既不会把顶层urllib包引入,也不会自动加载urllib.error这个子模块。所以你在写异常捕获逻辑时写的urllib.error.URLError,对解释器来说是完全未定义的名字,才会运行时报NameError,IDE的“Unresolved reference urllib”提示也是同一个原因。 - 另外你的测试代码里调用
get_webSite时传的链接缺了https://协议头,这虽然不是当前异常捕获失败的核心原因,但也会导致urlopen直接抛参数错误,是跑通功能需要补的细节。
修正实现
两种常用写法选其一即可,都能精准捕获离线场景下的URLError:
写法1:直接导入需要的异常类(代码更简洁)
from urllib.request import Request, urlopen from urllib.error import URLError from lxml import html def get_webSite(link): # 返回可被xPath解析的HTML页面 req = Request(link, headers={'User-Agent': 'Mozilla/5.0'}) return html.fromstring(urlopen(req).read()) try: # 链接必须补全协议头 htmlPage = get_webSite("https://www.example.com") print(htmlPage) except URLError as e: print(f"当前处于离线状态:{e.reason},请检查网络连接后重试")
写法2:保留全路径的异常引用方式
如果你习惯写完整的模块路径,就需要显式导入对应的模块:
import urllib.request import urllib.error from lxml import html def get_webSite(link): # 返回可被xPath解析的HTML页面 req = urllib.request.Request(link, headers={'User-Agent': 'Mozilla/5.0'}) return html.fromstring(urllib.request.urlopen(req).read()) try: htmlPage = get_webSite("https://www.example.com") print(htmlPage) except urllib.error.URLError as e: print(f"当前处于离线状态:{e.reason},请检查网络连接后重试")
补充说明:断开网络时触发的
getaddrinfo failed错误,本身就是被urllib模块封装为URLError抛出的,只要导入逻辑正确,完全可以精准匹配捕获,不需要靠无差别裸except兜底。如果后续需要处理HTTP状态错误(比如404、500这类),可以额外捕获同模块下的HTTPError,这个类本身是URLError的子类。
内容的提问来源于stack exchange,提问作者GoldNova
相关产品推荐
相关产品推荐

