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

