Selenium报错NoSuchElementException:已获数据仍报错求助
问题分析
你遇到的问题根源在于初始定位loans时选了表格下的所有子元素,这个集合的长度远大于实际的贷款列表行数。当循环的i值超过表格实际存在的行数时,driver.find_element就找不到对应行的元素,抛出NoSuchElementException。
比如你用//*[@id="comparison-table-0000000000"]//*会选中表格里的所有单元格、文本节点、按钮等,数量可能有几百个,但实际表格的行可能只有十几行,循环到超过行号的i时自然找不到元素。
解决方案
修改初始定位逻辑,直接获取表格的所有行元素,然后遍历这些行来提取数据:
import datetime import pandas as pd from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome() url = 'https://www.finder.com.au/home-loans' driver.get(url) driver.execute_script("window.scrollTo(0, 2080)") get_today = datetime.datetime.now() today = get_today.strftime('%d/%m/%Y') affiliate = 'Finder' rank = 1 results = [] # 直接定位表格的所有行,而不是所有子元素 loan_rows = WebDriverWait(driver, 30).until( EC.presence_of_all_elements_located((By.XPATH, '//*[@id="comparison-table-0000000000"]/tbody/tr')) ) # 遍历每一行,避免索引越界问题 for row in loan_rows: # 从当前行内查找a标签,比全局查找更准确高效 try: loan_listing = row.find_element(By.XPATH, './/a[1]').text print(loan_listing.split(' ', 1)) except Exception as e: # 处理个别行没有a标签的情况,避免程序中断 print(f"该行提取失败: {e}") continue
关键优化点
- 精准定位行元素:用
//*[@id="comparison-table-0000000000"]/tbody/tr直接获取所有贷款行,确保循环次数等于实际行数。 - 行内查找元素:通过
row.find_element从当前行内定位a标签,减少全局查找的开销,同时避免其他区域元素干扰。 - 异常捕获:添加try-except块处理个别行结构异常的情况,保证程序能完整执行。
内容的提问来源于stack exchange,提问作者notoriousBBG
相关产品推荐
相关产品推荐

