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
相关产品推荐
相关产品推荐

