Python Selenium提取表格tbody数据时无法定位tbody元素如何解决
核心问题原因
- 你点击院校选项后,表格数据是异步动态渲染的,固定的
time.sleep(2)不足以保证tbody完全加载完成,查找操作执行时tbody还没插入到DOM里,所以触发找不到元素的报错。 - 直接用
find_element_by_tag_name("table")定位太模糊,页面内可能存在多个表格,有可能匹配到了其他没有tbody的表格元素。 - 若你使用的是Selenium 4.0+版本,
find_element_by_*系列旧写法已经被官方弃用,也可能引发定位异常。
解决方案
1. 替换固定休眠为显式等待
用Selenium内置的显式等待逻辑,设定最长等待时间,直到tbody元素成功加载到DOM中再执行后续操作,比固定时间休眠兼容性更强。
2. 精准定位目标表格
你需要的目标表格id为DataTables_Table_4,直接通过id定位可以避免匹配到其他无关表格。
修改后参考代码
# 提前导入依赖包 from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 初始化等待对象,最长等待10秒,可根据网络情况自行调整 wait = WebDriverWait(driver, 10) for opt in element.find_elements(By.CSS_SELECTOR, "div.option"): # 记录院校名称 colleges.append(opt.get_attribute("data-value")) # 选择对应院校 opt.click() # 等待目标表格的tbody加载完成再执行后续操作 tbody = wait.until(EC.presence_of_element_located( (By.CSS_SELECTOR, "table#DataTables_Table_4 tbody") )) # 直接从tbody中提取所有行数据 rows = tbody.find_elements(By.TAG_NAME, "tr") for row in rows: data = [] data.append(year) data.append("Degrees Awarded") data_elements = row.find_elements(By.TAG_NAME, "td") for fact in data_elements: try: data.append(fact.text) except: print("nothing") print(data) # 原逻辑的插入DataFrame操作可正常打开使用 # DF.loc[len(DF.index)] = data # 重新点击下拉框,切换到下一个院校 element.click()
异常排查补充
如果修改后依然报错,可先打印当前页面源码,确认目标表格的id是否发生变化,若id是动态生成的,可改用class组合定位表格:table.cell-border.stripe.compact.dataTable,同时确认页面没有嵌套iframe,若有iframe需要先切换到对应iframe再执行元素查找。
内容的提问来源于stack exchange,提问作者Nikki Gorrell
相关产品推荐
相关产品推荐

