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

使用Python Selenium无法获取表格数据:tbody元素定位失败

问题:XPath定位tbody元素返回长度为0(预期为5)

目标元素代码

<tbody class="searchable ng-scope" ng-repeat="ut in vm.unitList | filter: (leaseLength: (vm.weekOption.value I l
&quot;')}">…</tbody>

使用的XPath://*[@id="no-more-tables"]/tbody

我的Python代码

driver.get(url)
# [图片描述]
property_name = driver.title
print('Property =====', property_name)

rooms = driver.find_elements(By.XPATH, '//*[@id="no-more-tables"]/tbody')
print(len(rooms))

问题现象

明明用了正确的XPath,但rooms的长度返回0,实际页面里应该有5个符合条件的tbody元素。


解决思路

  1. 等待元素加载完成
    页面是Angular动态渲染的,直接执行查找会赶在元素生成前运行。用显式等待确保元素加载完毕:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 等待最多10秒,直到目标元素出现
WebDriverWait(driver, 10).until(
    EC.presence_of_all_elements_located((By.XPATH, '//*[@id="no-more-tables"]/tbody'))
)
rooms = driver.find_elements(By.XPATH, '//*[@id="no-more-tables"]/tbody')
print(len(rooms))
  1. 验证XPath的准确性
    打开浏览器开发者工具(F12),在Console中输入$x('//*[@id="no-more-tables"]/tbody'),检查是否能找到目标元素:
  • 如果找不到,确认id="no-more-tables"的元素类型:如果该元素本身是tbody,XPath应改为//*[@id="no-more-tables"]
  • 可以尝试结合class定位,提高精准度://tbody[@class="searchable ng-scope"]
  1. 检查是否存在iframe嵌套
    如果目标元素在iframe内,必须先切换到对应iframe才能查找:
# 按id切换iframe,无id可使用索引或其他定位方式
driver.switch_to.frame("iframe_id")
# 执行元素查找操作
rooms = driver.find_elements(By.XPATH, '//*[@id="no-more-tables"]/tbody')
# 操作完成后切回主文档
driver.switch_to.default_content()
  1. 确认页面完全渲染
    Angular页面需等待渲染完成,可通过JavaScript判断请求状态:
# 等待所有Angular请求完成
while not driver.execute_script("return angular.element(document).injector().get('$http').pendingRequests.length === 0"):
    time.sleep(0.5)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 15:45:14