
HTML 元素的 class 属性值看似“换行”,实则为多个用空格分隔的独立类名;直接按含换行符的字符串查找会失败,应将其规范化为标准空格分隔格式后,使用 CSS 选择器或 find_elements(By.CLASS_NAME) 分别匹配单个类名。
html 元素的 class 属性值看似“换行”,实则为多个用空格分隔的独立类名;直接按含换行符的字符串查找会失败,应将其规范化为标准空格分隔格式后,使用 css 选择器或 `find_elements(by.class_name)` 分别匹配单个类名。
在 HTML 中,class 属性是一个以空格分隔的字符串列表,用于声明元素所属的一个或多个 CSS 类。即使你在浏览器开发者工具中看到类似如下格式:
<div class=" ll-sets-words__row
false
"></div>这并非真正的“多行 class 名”,而是 HTML 解析器自动将所有空白字符(包括换行、制表符、连续空格)压缩为单个空格后的结果。因此,该元素实际拥有的两个类名为:ll-sets-words__row 和 false。
⚠️ 关键误区:By.CLASS_NAME 仅支持匹配单个类名,且不接受含空格、换行或多个类的字符串。你当前代码中:
class_name = """
ll-sets-words__row
false
"""
browser.find_elements(By.CLASS_NAME, class_name) # ❌ 错误:传入了含换行/多余空格的多类字符串这会导致 NoSuchElementException 或 InvalidSelectorException,因为 Selenium 将其视为一个非法类名(含不可见字符和空格)。
立即学习“前端免费学习笔记(深入)”;
✅ 正确做法有以下两种:
✅ 方案一:使用 By.CLASS_NAME 查找单个类(推荐用于批量匹配)
若目标元素统一拥有 ll-sets-words__row 这个类(无论是否同时带 false),直接按该单一类名查找即可:
words = entire_dict.find_elements(By.CLASS_NAME, "ll-sets-words__row")
print(f"找到 {len(words)} 个元素")
for e in words:
print(e.text.strip())✅ 优势:简洁、高效、天然支持批量获取所有匹配元素。
✅ 方案二:使用 CSS 选择器精准匹配多个类(更严谨)
若需确保元素同时具备 ll-sets-words__row 和 false 两个类(即 class="ll-sets-words__row false"),应使用 CSS 选择器:
# 注意:CSS 中多个类用点连接,无空格 → .ll-sets-words__row.false words = entire_dict.find_elements(By.CSS_SELECTOR, ".ll-sets-words__row.false")
✅ 优势:语义明确,避免误匹配仅含其中一个类的元素。
? 补充验证技巧(调试必备)
在定位前,可先打印实际 class 属性值,确认真实结构:
sample_elem = browser.find_element(By.CSS_SELECTOR, "div.ll-sets-words__row")
print(repr(sample_elem.get_attribute("class"))) # 输出类似:'ll-sets-words__row false'这能帮你直观识别空格分隔的真实类名,避免被格式误导。
⚠️ 注意事项总结:
- By.CLASS_NAME 只接受纯净、无前后空格、不含换行、仅含一个类名的字符串;
- 浏览器 DevTools 显示的“多行”是美化渲染,实际 DOM 中 class 值已标准化为空格分隔;
- 不要尝试用 By.CLASS_NAME 传入 "ll-sets-words__row false" —— 这会被当作一个类名,必然失败;
- 若需组合条件(如“同时含 A 和 B 类”),必须使用 By.CSS_SELECTOR 或 By.XPATH;
- BeautifulSoup 同理:soup.find_all(class_="ll-sets-words__row") 有效,但 class_="ll-sets-words__row false" 无效(应改用 soup.select(".ll-sets-words__row.false"))。
掌握 class 属性的本质(空格分隔的类集合),就能避开绝大多数定位失效问题。



















