Selenium Python获取表格行数结果不正确的问题求助
嘿,我来帮你排查下这个问题,这种找不到元素的情况我之前也碰到过好多次,大概率是这几个原因之一:
先理下你的问题:你要获取一个HTML表格的行数,预期应该是20行,但用Selenium写了两个XPath去查找<tr>元素,结果都返回0,试了各种路径变体也没得到正确结果。你提到通过开发者工具查看,表格嵌套在id为BreakdownRptdiv的容器里,表格本身id是tbl_BreakdownRpt,且在tbody[2]下有预期的20个<tr>元素。
给你几个排查方向和解决办法:
动态加载等待不足:表格很大概率是通过JavaScript动态渲染出来的,你代码里直接去查找元素时,DOM里还没生成这些
<tr>节点,自然返回0。试试用显式等待来确保元素加载完成:from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 最多等10秒,直到表格的tr元素出现 WebDriverWait(web, 10).until( EC.presence_of_all_elements_located((By.XPATH, '//*[@id="tbl_BreakdownRpt"]/tr')) ) existingList = web.find_elements(By.XPATH, '//*[@id="tbl_BreakdownRpt"]/tr') print(len(existingList))浏览器自动补全tbody的坑:你在开发者工具里看到的
tbody[2],很可能是浏览器自动给表格补的标签,实际网页的HTML源码里根本没有这个节点!你可以右键点击页面选择“查看页面源码”(不是Elements面板),搜索下tbody看看是不是真的存在。如果源码里没有,那你的XPath里加了tbody自然就匹配不到元素了。元素在iframe中:如果这个表格是嵌套在iframe里面的,那你直接查找元素肯定找不到,得先切换到对应的iframe再操作:
# 先定位到目标iframe(可以用id、name或者其他属性,这里假设id是iframe_id) iframe = web.find_element(By.ID, 'iframe_id') # 切换到该iframe web.switch_to.frame(iframe) # 之后再去查找表格的tr元素 existingList = web.find_elements(By.XPATH, '//*[@id="tbl_BreakdownRpt"]/tr') print(len(existingList)) # 操作完成后记得切回主文档 web.switch_to.default_content()定位路径准确性问题:再仔细核对下你用的id是否正确,比如
BreakdownRptdiv和tbl_BreakdownRpt在页面源码里能不能搜到?有时候前端会动态生成id,或者你从开发者工具复制XPath时多/少选了节点,导致路径错误。
你可以先从等待元素加载和检查页面源码里的真实DOM结构这两点入手,这两个是最常见的原因,应该能帮你解决问题!
备注:内容来源于stack exchange,提问作者lems

