使用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 "')}">…</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元素。
解决思路
- 等待元素加载完成
页面是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))
- 验证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"]
- 检查是否存在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()
- 确认页面完全渲染
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
相关产品推荐
相关产品推荐

