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

Selenium(Python)递归爬取异常求助:仅返回分类首个元素

问题分析与修复方案

核心问题点

  • 空列表判断错误:liste_lien == ""完全错误,find_elements()返回的是WebElement列表,空列表应该用if not liste_lien判断。
  • 递归未收集结果:当前代码调用递归后未保存返回值,循环结束后也没有返回汇总结果,导致上层无法获取所有子节点的数据。
  • 资源浪费与泄漏:每次循环都新建Chrome实例且未关闭,会残留大量浏览器进程。
  • 无容错处理:直接调用find_element(),若某个table里没有a标签会直接抛出异常,中断爬取流程。

修正后的代码

from selenium.common.exceptions import NoSuchElementException

def crawl_table(driver, max_depths):
    # 优先判断是否达到最大深度
    if max_depths == 0:
        return [get_fiche(driver)]
    
    liste_lien = driver.find_elements(By.TAG_NAME, 'table')
    # 正确判断是否存在table元素
    if not liste_lien:
        return [get_fiche(driver)]
    
    results = []
    for element in liste_lien:
        print(element.text)
        try:
            lien = element.find_element(By.TAG_NAME, 'a')
            href = lien.get_attribute('href')
            if href:
                # 复用当前驱动跳转页面,无需新建实例
                driver.get(href)
                # 收集递归返回的子节点结果
                sub_results = crawl_table(driver, max_depths - 1)
                results.extend(sub_results)
                # 返回上一页,继续处理下一个table
                driver.back()
        except NoSuchElementException:
            # 无a标签的table,直接获取当前页面内容
            results.append(get_fiche(driver))
    return results

关键优化说明

  • 复用驱动实例:不再重复创建Chrome进程,用当前驱动跳转页面,处理完子节点后返回上一页,大幅节省系统资源。
  • 统一结果收集:用results列表汇总所有层级的爬取数据,最后统一返回,确保所有子节点内容都能被上层获取。
  • 容错机制:捕获NoSuchElementException,避免因单个table无a标签导致整个爬取流程中断。
  • 逻辑修正:调整判断顺序,先检查深度限制再判断table元素,逻辑更清晰合理。
  • 统一返回格式:所有分支都返回列表类型,保证递归过程中结果结构一致,避免出现仅返回单个元素的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 21:40:33