Selenium调用get_attribute()获取value值始终返回1的问题求助
问题原因
- 你使用的
sc-开头的类名是前端CSS-in-JS框架自动生成的动态类名,这类类名会随前端代码构建部署动态变更,你在浏览器中当前看到的类名,和爬虫实际运行时加载的页面类名可能存在差异,也可能后续站点更新类名直接失效,不适合作为定位依据。 - 隐式等待仅能判断元素是否被加载到DOM树中,无法判断元素的
value属性是否已经被前端JavaScript逻辑填充为最终值,你取到的1是输入框的初始默认值,还没等JS把实际价格赋值完成就执行了取值操作。 - 注意你问题中给出的目标页面地址,和代码里
driver.get传入的地址并不一致,需要先确认请求地址是否正确。
解决方案
- 替换定位逻辑,去掉动态类名,使用更稳定的属性定位:
仅保留tabindex属性定位即可,对应XPath改为//input[@tabindex="2"] - 将隐式等待替换为显式等待,主动等待输入框的value值更新为非初始值再取值,示例修正代码如下:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By def scrape_price(): options = Options() options.headless = True options.add_argument("--window-size=1920,1200") driver = webdriver.Chrome(options=options, executable_path=DRIVER_PATH) # 确认此处地址和你要爬的目标地址一致 driver.get('https://kek.tools/t/0x4e15361fd6b4bb609fa63c81a2be19d873717870') # 显式等待最多10秒,直到输入框value不等于初始值1 wait = WebDriverWait(driver, 10) price_input = wait.until( lambda d: d.find_element(By.XPATH, '//input[@tabindex="2"]') if d.find_element(By.XPATH, '//input[@tabindex="2"]').get_attribute("value") != "1" else False ) print(price_input.get_attribute("value")) driver.quit()
- 更稳定的方案是直接抓站点的价格查询接口,这类加密货币价格站点通常会调用链上数据接口或者第三方价格接口,直接请求接口拿到结构化数据,不需要处理前端渲染的各种异常问题,效率和稳定性都远高于爬取前端元素。
内容的提问来源于stack exchange,提问作者ckrug
相关产品推荐
相关产品推荐

