
在 goquery 中,`class="text title"` 表示元素同时拥有 `text` 和 `title` 两个独立类名;需用 `.text.title`(无空格、连续点号)语法才能准确匹配同时具备这两个类的元素。
HTML 中的 class 属性支持多个空格分隔的类名,这并非“带空格的单一类名”,而是语义上的多类并存。因此, 实际等价于该元素同时具有 text 类和 title 类 —— 这是 CSS 选择器规范的基础逻辑,goquery 完全遵循此标准。
✅ 正确写法:匹配同时拥有多个类的元素
要查找同时具有 text 和 title 两个类的 ,必须使用 连写无空格的 CSS 选择器:
doc.Find(".text.title").Each(func(i int, s *goquery.Selection) {
class, _ := s.Attr("class")
fmt.Printf("class=%q, text=%q\n", class, s.Text())
})
// 输出:class="text title", text="Go "⚠️ 注意:.text title(含空格)是后代选择器,表示「在 .text 元素内部查找任意 title 元素」,与目标完全无关;而 .text.title(无空格)才是「同时拥有 text 和 title 两个类」的联合选择器。
? 其他常见用法对比
| 选择器 | 含义 | 是否匹配 |
|---|---|---|
| .text | 拥有 text 类的任意元素 | ✅ 是(也匹配 class="text" 或 class="text post") |
| .title | 拥有 title 类的任意元素 | ✅ 是(匹配该 ,也匹配其他仅含 title 的元素) |
| .text.title | 同时拥有 text 和 title 的元素 | ✅ 是(精准匹配) |
| .text .title(空格) | .text 元素内部的 .title 元素(后代) | ❌ 否(此处无嵌套关系) |
? 实用建议
- 始终将 class 属性视为类名集合,而非字符串;解析时按空格切分(如 strings.Fields(class))更符合语义。
- 若需动态构建多类选择器(如从变量 classes = []string{"text", "title"} 生成),可安全拼接:
selector := "." + strings.Join(classes, ".") doc.Find(selector).Each(/* ... */)
- 避免正则或字符串模糊匹配 class 属性——既低效又易出错(如 class="textual" 会被误匹配 .text)。
掌握这一 CSS 选择器本质,是高效使用 goquery 解析复杂 HTML 的关键基础。
立即学习“前端免费学习笔记(深入)”;











