如何在Python Selenium中用nth-child/CSS选择器提取加密货币数据
解决Selenium提取比特币市值和24小时交易量的CSS选择器问题
你的问题核心是CSS选择器写法错误,以及未处理页面加载时序问题:
- 错误代码里的
div.css-1y4us2f#__next是无效选择器——#__next是最外层div的ID,css-1y4us2f是它的后代元素class,不能混写在同一个元素选择器里; - 原代码两次调用
find_element取同一个class,只会返回第一个匹配元素,导致重复获取市值。
下面是两种可行的解决方式:
方案1:批量获取匹配元素后按索引取值
直接获取所有带目标class的元素,通过索引区分市值(第一个)和24小时交易量(第二个),逻辑简单直观:
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 def get_data(driver: webdriver.Chrome, link): dict_data = {} driver.get(link) # 等待所有目标元素加载完成,最长等待10秒 stats_elements = WebDriverWait(driver, 10).until( EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".css-1c8c51m")) ) # 按索引提取对应数据 dict_data['market cap'] = stats_elements[0].text dict_data['24H volume'] = stats_elements[1].text print(f"市值: {dict_data['market cap']}") print(f"24小时交易量: {dict_data['24H volume']}") return dict_data
方案2:使用精准层级的CSS选择器定位
根据你提供的HTML结构,两个数值分别在.css-1y4us2f下的第1个和第2个.css-95687q容器内,用nth-child定位父容器后再取子元素:
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 def get_data(driver: webdriver.Chrome, link): dict_data = {} driver.get(link) wait = WebDriverWait(driver, 10) # 定位第一个容器中的市值 market_cap = wait.until( EC.presence_of_element_located((By.CSS_SELECTOR, ".css-1y4us2f > div.css-95687q:nth-child(1) > p.css-1c8c51m")) ).text # 定位第二个容器中的24小时交易量 volume = wait.until( EC.presence_of_element_located((By.CSS_SELECTOR, ".css-1y4us2f > div.css-95687q:nth-child(2) > p.css-1c8c51m")) ).text dict_data['market cap'] = market_cap dict_data['24H volume'] = volume print(f"市值: {market_cap}") print(f"24小时交易量: {volume}") return dict_data
重要提示
- 必须添加显式等待:页面加载需要时间,直接调用
find_element很容易因为元素未渲染完成抛出NoSuchElementException,用WebDriverWait等待元素出现后再操作是最佳实践; - 写CSS选择器时要注意层级:
>表示直接子元素,nth-child(n)是针对当前父元素的子元素排序,不要把不同元素的ID和class错误合并。
内容的提问来源于stack exchange,提问作者Lewis-010
相关产品推荐
相关产品推荐

