You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Selenium爬取类名相同但数据不同的两个网页元素

问题原因&解决方案

核心错误点

  • CSS选择器语法错误:同一个元素同时携带soundStats和sc-ministats-group两个类时,需要用.拼接类名且每个类名前加.,你写的soundStats sc-ministats-group会被解析为「查找标签为soundStats的元素下,标签为sc-ministats-group的子元素」,完全不符合页面结构,自然抛出NoSuchElementException。
  • 同类名元素定位逻辑错误:直接全局查找sc-visuallyhidden类元素,Selenium默认只返回第一个匹配到的元素(也就是上传日期),无法获取后续同类名的播放量数据,需要先限定父元素范围,再在父元素内部查找对应子元素。
  • 方法调用逻辑错误:find_element_by_css_selector仅返回单个元素,无法直接遍历,要获取多个作品的播放量数据需要用复数形式find_elements_by_css_selector。

修正后可运行代码

import time
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

# 注意Windows路径要加r转义,避免字符转义问题
PATH = r"C:\Program Files (x86)\chromedriver.exe"
driver = webdriver.Chrome(PATH)
# 加隐式等待,避免页面未加载完成就查找元素
driver.implicitly_wait(10)

driver.get('https://soundcloud.com/jujubucks')
print(driver.title)

# 定位基础信息
search = driver.find_element(By.CLASS_NAME, 'soundTitle__usernameText')
search_song = driver.find_element(By.XPATH, '//span[@class=""]')
# 限定上传日期的父元素范围,避免和播放量元素混淆
search_date = driver.find_element(By.CSS_SELECTOR, '.soundTitle__uploadTime .sc-visuallyhidden')

print(f'''
Artist: {search.text}
Song Title: {search_song.text}
Upload Date: {search_date.text}
''')

# 正确写多类名的CSS选择器,获取所有作品的统计栏父元素
search_plays = driver.find_elements(By.CSS_SELECTOR, '.soundStats.sc-ministats-group')
for search_play in search_plays:
    # 在单个作品的统计栏内部查找播放量元素
    stats = search_play.find_element(By.CLASS_NAME, 'sc-visuallyhidden')
    print(f'''
Track Plays: {stats.text}
    ''')

driver.quit()

补充说明

如果使用Selenium 4.3+版本,旧的find_element_by_*系列方法已被官方移除,统一使用find_element(By.XXX, 值)的写法,上述代码已经适配该规范。

内容的提问来源于stack exchange,提问作者Houston Khanyile

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 07:09:03