如何使用Selenium Python获取span数据?元素定位失败求助
问题解决:Selenium无法获取亚马逊搜索结果元素
你的代码存在几个关键问题,导致无法成功获取目标元素,以下是具体修正方案:
核心问题点
- 变量作用域错误:
driver是amazon_data方法内的局部变量,方法外的代码无法访问它;而且你把获取元素的代码写在了方法外部,完全没参与到搜索流程中。 - CLASS_NAME定位规则错误:
By.CLASS_NAME仅支持单个类名,你传入的是多个空格分隔的类名,直接导致定位失败。 - 等待方式不可靠:硬编码的
time.sleep无法保证页面元素完全加载,容易出现元素未就绪就执行定位的情况。
修正后的代码
import time from selenium import webdriver from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC class Amazon(): def amazon_data(self): # 初始化浏览器 driver = webdriver.Chrome(executable_path=ChromeDriverManager().install()) driver.get(url="https://www.amazon.com/") # 执行搜索操作 input_search = driver.find_element(By.XPATH,"//input[@id='twotabsearchtextbox']") input_search.send_keys("smart phones under 100000") time.sleep(1) search_button = driver.find_element(By.XPATH,"//input[@id='nav-search-submit-button']") search_button.click() # 显式等待目标元素加载完成,最长等待10秒 try: # 用CSS_SELECTOR定位多类名元素,类名间用点连接 elements = WebDriverWait(driver, 10).until( EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".a-size-medium.a-color-base.a-text-normal")) ) print(f"找到元素数量:{len(elements)}") # 遍历获取每个span的文本内容 for elem in elements: print(elem.text) except Exception as e: print(f"获取元素失败:{str(e)}") # 可选:关闭浏览器 driver.quit() # 实例化并调用方法 object = Amazon() object.amazon_data()
关键修改说明
- 调整代码结构:将获取元素的逻辑移至
amazon_data方法内部,确保在搜索操作完成后执行。 - 替换定位方式:用
By.CSS_SELECTOR替代By.CLASS_NAME,多类名的写法为每个类名前加.并去除空格(如.a-size-medium.a-color-base.a-text-normal)。 - 改用显式等待:使用
WebDriverWait配合expected_conditions,等待元素出现后再执行定位,比time.sleep更稳定可靠。 - 添加异常捕获:避免因元素加载失败导致程序直接崩溃,同时输出错误信息便于排查问题。
内容的提问来源于stack exchange,提问作者Shoaib Shoukat
相关产品推荐
相关产品推荐

