
HTML 元素的 class 属性值看似含有多行缩进,实则为以空格分隔的多个独立类名;直接按换行字符串匹配会失败,应将其规范化为标准空格分隔格式,并使用 CSS 选择器或 find_elements(By.CSS_SELECTOR, ...) 精准定位。
html 元素的 `class` 属性值看似含有多行缩进,实则为以空格分隔的多个独立类名;直接按换行字符串匹配会失败,应将其规范化为标准空格分隔格式,并使用 css 选择器或 `find_elements(by.css_selector, ...)` 精准定位。
在 HTML 中,class 属性本质上是一个以空格分隔的类名列表(如 class="ll-sets-words__row false"),浏览器开发者工具中显示的“多行”效果仅是源码缩进或格式化呈现(如换行+缩进),DOM 解析后实际值为单行、空格分隔的字符串。因此,By.CLASS_NAME 定位器仅支持单个类名(且不接受空格、换行或多个类),当你传入含换行缩进的字符串(如 "\n ll-sets-words__row\n false\n ")时,Selenium 会因非法类名格式抛出异常。
✅ 正确做法是:
- 识别真实类名:从 DevTools 复制的“多行”内容实为两个独立类 —— ll-sets-words__row 和 false;
- 避免 By.CLASS_NAME 多类匹配:它不支持 class_name="ll-sets-words__row false" 这种写法;
- 改用 By.CSS_SELECTOR:这是最可靠、最灵活的方式,支持多类组合、部分匹配及精确筛选。
以下是优化后的 Selenium 示例代码:
# ✅ 推荐:使用 CSS 选择器匹配同时拥有两个类的元素 words = entire_dict.find_elements(By.CSS_SELECTOR, ".ll-sets-words__row.false") # ✅ 或仅匹配其中一个类(更宽松,但需确保唯一性) words = entire_dict.find_elements(By.CSS_SELECTOR, ".ll-sets-words__row") # ✅ 若需排除干扰(如 false 类可能动态变化),可结合属性选择器 words = entire_dict.find_elements(By.CSS_SELECTOR, "[class*='ll-sets-words__row'][class*='false']")
⚠️ 注意事项:
立即学习“前端免费学习笔记(深入)”;
- By.CLASS_NAME 仅接受单一、无空格、无换行的类名字符串(如 "ll-sets-words__row"),传入多类或带空白字符必报错;
- BeautifulSoup 同理:soup.find_all(class_="ll-sets-words__row false") 无效,应改用 soup.select(".ll-sets-words__row.false");
- false 作为类名虽合法,但语义易混淆,建议检查是否为动态生成的布尔标记(如 data-active="false"),此时优先用属性选择器而非类名;
- 实际开发中,应通过 element.get_attribute("class") 打印真实 class 值验证,而非依赖 DevTools 的格式化显示。
总结:HTML class 属性没有“多行”概念,只有空格分隔的类集合;放弃对 By.CLASS_NAME 的多类幻想,拥抱 CSS_SELECTOR —— 它既支持 .a.b(同时含 a 和 b)、.a(含 a 即可),也支持 [class^="ll-"](前缀匹配),是处理复杂类名场景的工业级标准方案。



















