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

Python Selenium中通过类名获取属性值失败的问题排查

问题描述

我想从class为favorites-video favorites-table-spacing的视频元素列表中,提取data-rbd-drag-handle-draggable-id属性中的视频ID并存入列表。对应的HTML示例如下:

<div class="favorites-video favorites-table-spacing" data-rbd-draggable-context-id="2" data-rbd-draggable-id="6568ff097b469e24dce6eae8key0" tabindex="0" role="button" aria-describedby="rbd-hidden-text-2-hidden-text-10" data-rbd-drag-handle-draggable-id="6568ff097b469e24dce6eae8key0" data-rbd-drag-handle-context-id="2" draggable="false">

<div class="favorites-video favorites-table-spacing" data-rbd-draggable-context-id="2" data-rbd-draggable-id="6568ff097b469e24dce6eae8key0" tabindex="0" role="button" aria-describedby="rbd-hidden-text-2-hidden-text-10" data-rbd-drag-handle-draggable-id="6568ff097b469e24dce6eae8key0" data-rbd-drag-handle-context-id="2" draggable="false">

<div class="favorites-video favorites-table-spacing" data-rbd-draggable-context-id="2" data-rbd-draggable-id="6552711226e176c233b46379key2" tabindex="0" role="button" aria-describedby="rbd-hidden-text-2-hidden-text-10" data-rbd-drag-handle-draggable-id="6552711226e176c233b46379key2" data-rbd-drag-handle-context-id="2" draggable="false">

我已通过浏览器开发者工具确认该类名组合是唯一的,但使用以下代码时,id_videolist仅返回[],无法获取元素:

id_videolist = []

favvideos = driver.find_elements(By.CLASS_NAME, 'favorites-video favorites-table-spacing') 
for video in favvideos:     
    vidId = video.get_attribute('data-rbd-drag-handle-draggable-id') 
    vidId = vidId[:-4]
    id_videolist.append(vidId)
问题原因
  • By.CLASS_NAME不支持多类名组合:Selenium的By.CLASS_NAME定位器只能接收单个类名,传入空格分隔的多个类名会直接失效,无法匹配到任何元素。
  • 额外隐患:即使成功定位到元素,直接对vidId执行[:-4]切片操作可能报错——如果属性获取失败返回None,切片会触发TypeError。
修正方案

方法1:使用CSS_SELECTOR定位多类名元素

用CSS选择器的.语法组合多个类名,这是定位多类名元素的标准方式:

id_videolist = []

# 通过CSS_SELECTOR匹配同时包含两个类的div元素
favvideos = driver.find_elements(By.CSS_SELECTOR, '.favorites-video.favorites-table-spacing') 
for video in favvideos:     
    vidId = video.get_attribute('data-rbd-drag-handle-draggable-id')
    # 先判断属性是否有效,再执行切片操作
    if vidId:
        vidId = vidId[:-4]
        id_videolist.append(vidId)

方法2:使用XPATH定位

也可以通过XPATH匹配同时拥有两个目标类的元素:

id_videolist = []

favvideos = driver.find_elements(By.XPATH, '//div[contains(@class, "favorites-video") and contains(@class, "favorites-table-spacing")]')
for video in favvideos:     
    vidId = video.get_attribute('data-rbd-drag-handle-draggable-id')
    if vidId:
        vidId = vidId[:-4]
        id_videolist.append(vidId)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 12:22:45