Selenium循环搜索问题:新搜索始终获取旧搜索元素
问题分析与解决方案
看起来你的问题出在选择器意外匹配到了首页的初始元素,而非搜索跳转后的目标页面元素。我来拆解下原因和修复方案:
为什么会重复获取第一次的结果?
你每次循环都打开新的Firefox实例,访问CoinGecko首页后输入币种名回车,但这里有个关键问题:
- CoinGecko首页本身就展示着比特币的价格,而你用的选择器
div.text-3xl > span:nth-child(1)刚好能匹配到这个首页元素 - 当你回车搜索后,页面跳转需要一定时间,但你的
wait.until提前捕获到了首页的这个元素,导致每次都输出比特币的价格,和你实际搜索的币种无关
修复方案
方案1:使用更精准的选择器
CoinGecko的币种详情页中,价格元素有更独特的标识,比如可以用这个只匹配详情页价格的选择器:
first_result = wait.until(presence_of_element_located((By.CSS_SELECTOR, ".price > span[data-price-target]")))
这个选择器只会锁定详情页的价格元素,不会和首页的元素冲突。
方案2:等待页面URL完成跳转
在获取元素前,先确认页面已经跳转到目标币种的详情页,比如检查URL包含对应币种的关键词:
# 等待页面URL包含当前搜索的币种名 wait.until(lambda driver: t in driver.current_url.lower()) first_result = wait.until(presence_of_element_located((By.CSS_SELECTOR, "div.text-3xl > span:nth-child(1)")))
这样能确保页面完全跳转后再去获取元素,避免提前捕获首页内容。
方案3:优化浏览器实例(可选,提升效率)
你现在每次循环都打开新浏览器,不仅速度慢还浪费资源,可以改成打开一次浏览器,循环处理所有币种:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support.expected_conditions import presence_of_element_located EXE_PATH = r'C:\geckodriver.exe' tickers = ["bitcoin", "ethereum", "litecoin"] with webdriver.Firefox(executable_path=EXE_PATH) as driver: wait = WebDriverWait(driver, 10) driver.get("https://coingecko.com/en") for t in tickers: # 每次搜索前清空输入框,避免残留内容 search_box = driver.find_element_by_css_selector(".px-2") search_box.clear() search_box.send_keys(t + Keys.RETURN) # 等待页面跳转后获取价格 wait.until(lambda driver: t in driver.current_url.lower()) first_result = wait.until(presence_of_element_located((By.CSS_SELECTOR, ".price > span[data-price-target]"))) price = first_result.get_attribute("innerHTML") print(f"{t}: {price}")
额外提示
- 尽量避免使用过于通用的CSS选择器(比如
div.text-3xl),这类选择器很容易匹配到页面上的无关元素 - 复用浏览器实例时,一定要记得清空输入框,防止之前的输入内容干扰新的搜索
内容的提问来源于stack exchange,提问作者placeholder
相关产品推荐
相关产品推荐

