如何使用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
相关产品推荐
相关产品推荐

