
html 元素的 class 属性值虽在开发者工具中显示为多行缩进格式,但实际是单行字符串,其中的换行和多余空格会被浏览器自动规范化为空格分隔符;因此该 class 值本质是多个独立 class 的组合(如 `"ll-sets-words__row false"`),而非一个含换行符的单一类名。
在 HTML 规范中,class 属性是一个以空格分隔的类名列表(whitespace-separated tokens),浏览器会自动将换行符、制表符、连续空格等所有空白字符统一视为单个分隔符。你从 DevTools 复制的如下内容:
ll-sets-words__row
false实际等价于:
class="ll-sets-words__row false"
这意味着该元素同时拥有两个 class:ll-sets-words__row 和 false。而 Selenium 的 By.CLASS_NAME 仅支持匹配单个精确类名(不能含空格或多个类),因此传入带换行/空格的字符串(如 "\n ll-sets-words__row\n false\n")会导致 InvalidSelectorException 或查无结果。
✅ 正确做法是:使用 By.CSS_SELECTOR 并通过类选择器组合精准定位所有目标元素,而非强行依赖 By.CLASS_NAME。例如:
立即学习“前端免费学习笔记(深入)”;
# ✅ 推荐:查找同时具有两个 class 的所有元素(顺序无关) words = entire_dict.find_elements(By.CSS_SELECTOR, ".ll-sets-words__row.false") # ✅ 或更灵活:查找拥有至少其中一个 class 的元素(若语义允许) words = entire_dict.find_elements(By.CSS_SELECTOR, ".ll-sets-words__row, .false") # ✅ 或最稳妥:结合父容器 + class 组合,避免误匹配 words = browser.find_elements(By.CSS_SELECTOR, "table.ll-page-vocabulary__sets-words__table .ll-sets-words__row.false")
⚠️ 注意事项:
- By.CLASS_NAME("ll-sets-words__row false") 是非法用法,Selenium 会直接报错;
- BeautifulSoup.find_all(class_="...") 同样只接受单个类名或 list[str](如 class_=["ll-sets-words__row", "false"]),但需注意:class_=["A","B"] 表示「同时包含 A 和 B」,与 CSS 中 .A.B 等价;
- 若需动态提取 class 列表,可用 element.get_attribute("class") 获取原始字符串,再用 .split() 清洗(自动去除首尾空格及中间多余空白):
raw_class = element.get_attribute("class") # 返回 "ll-sets-words__row false" classes = raw_class.split() # → ['ll-sets-words__row', 'false']
? 总结:不要被 DevTools 的格式误导——HTML class 永远是空格分隔的扁平列表。优先使用 By.CSS_SELECTOR 实现多类联合匹配,它语义清晰、性能优异,且天然支持 .class1.class2(AND 关系)或 .class1, .class2(OR 关系)等灵活写法,完全满足“查找所有具备指定类组合的元素”的需求。











