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
相关产品推荐
相关产品推荐

