You need to enable JavaScript to run this app. Python爬取网页做离线异常处理时遇urllib未解析引用报错如何解决
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.06 06:54:10