在 goquery 中,`class="text title"` 表示元素同时拥有 `text` 和 `title` 两个独立类名;需用 `.text.title`(无空格、连续点号)语法才能准确匹配同时具备这两个类的元素。
HTML 中的 c
lass 属性支持多个空格分隔的类名,这并非“带空格的单一类名”,而是语义上的多类并存。因此, 实际等价于该元素同时具有 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 元素(后代) | ❌ 否(此处无嵌套关系) |
selector := "." + strings.Join(classes, ".") doc.Find(selector).Each(/* ... */)
掌握这一 CSS 选择器本质,是高效使用 goquery 解析复杂 HTML 的关键基础。