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

BeautifulSoup循环中select_one取text报AttributeError如何修复

问题原因

异常捕获类型和实际抛出的异常不匹配:BeautifulSoup的select_one()方法找不到匹配DOM元素时返回值为None,对None类型对象调用.text属性抛出的是AttributeError,而非代码中捕获的ValueError,因此异常拦截逻辑未生效,触发偶发报错。
另外贴出的代码首行url=http://www.mercadopublico.cl/Procurement/Modules/RFB/DetailsAcquisition.aspx?idlicitacion=3951-24-L122为无效代码:字符串赋值未加引号,且后续请求逻辑使用变量i作为目标链接,该行无实际作用,建议删除或修正。

修复方案

方案1:修正异常捕获类型

将捕获的异常类型替换为实际抛出的AttributeError,元素缺失时为字段设置默认值即可,不会中断批量爬取循环:

try:
    estado_licitacion = soup.select_one("#lblFicha1Estado").text
except AttributeError:
    # 可根据业务需求设置默认值,如空字符串、"无"等标记
    estado_licitacion = ""
    # 可选:打印异常链接便于后续排查
    print(f"链接 {i} 未找到#lblFicha1Estado状态字段")

注意:代码中其余直接链式调用.text的字段(licitation_number、responsable、ficha、nombre_licitacion)若存在偶发缺失可能,建议统一添加容错逻辑,避免其他字段缺失时同样抛出异常中断任务。

方案2:先判空再取值(逻辑更直观,推荐使用)

无需依赖异常捕获,先校验选择器返回的元素对象是否存在,再提取文本内容:

estado_element = soup.select_one("#lblFicha1Estado")
if estado_element:
    # 追加strip()可自动去除文本前后多余的换行、空白字符
    estado_licitacion = estado_element.text.strip()
else:
    estado_licitacion = ""
    print(f"链接 {i} 未找到#lblFicha1Estado状态字段")

若爬取字段较多,可封装通用提取函数减少重复判空代码:

def get_ele_text(soup, css_selector, default=""):
    ele = soup.select_one(css_selector)
    return ele.text.strip() if ele else default

# 所有字段均可直接调用该方法提取,自动处理元素缺失场景
licitation_number = get_ele_text(soup, "#lblNumLicitacion")
responsable = get_ele_text(soup, "#lblResponsable")
ficha = get_ele_text(soup, "#lblFicha2Reclamo")
nombre_licitacion = get_ele_text(soup, "#lblNombreLicitacion")
estado_licitacion = get_ele_text(soup, "#lblFicha1Estado")

内容的提问来源于stack exchange,提问作者kcomarks

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 00:09:20