
本文介绍如何在 go 中借助 goquery 库,通过类名(如 `.funcname`)等 css 选择器高效解析 html 页面并提取目标元素的文本或属性值。
在 Go 语言生态中,原生 net/html 包虽可实现 HTML 解析,但语法低层、操作繁琐。更推荐使用社区广泛采用的 goquery —— 它借鉴 jQuery 的链式 API 设计,支持标准 CSS 选择器(如 .class、#id、div > p、[data-value] 等),大幅提升开发效率与可读性。
快速上手示例
首先安装依赖:
go get github.com/PuerkitoBio/goquery
以下是一个完整示例:从 HTML 字符串中提取所有具有 class="funcname" 的
package main
import (
"fmt"
"strings"
"github.com/PuerkitoBio/goquery"
)
func main() {
html := `
fmt.Println
log.Fatal
strings.ToUpper
`
doc, err := goquery.NewDocumentFromReader(strings.NewReader(html))
if err != nil {
panic(err)
}
// 使用 CSS 选择器查找所有 .funcname 元素
doc.Find(".funcname").Each(func(i int, s *goquery.Selection) {
text := strings.TrimSpace(s.Text())
fmt.Printf("第 %d 个 funcname: %q\n", i+1, text)
})
}输出:
立即学习“前端免费学习笔记(深入)”;
第 1 个 funcname: "fmt.Println" 第 2 个 funcname: "strings.ToUpper"
常用操作扩展
- ✅ 获取属性值:s.Attr("data-id")
- ✅ 获取 HTML 内容(含标签):s.Html()
- ✅ 获取纯文本(自动去除空白与换行):s.Text()
- ✅ 链式筛选:doc.Find("div.funcname").Find("code").Text()
- ✅ 从远程 URL 加载:goquery.NewDocument("https://example.com")(自动处理 HTTP 请求与重定向)
注意事项
- goquery.NewDocument() 默认会发起 HTTP 请求,生产环境建议配合 http.Client 设置超时与 User-Agent;
- 若解析本地 HTML 字符串或 io.Reader,优先使用 NewDocumentFromReader() 避免误触发网络请求;
- Selection 对象是不可变的,所有 .Find()、.Children() 等方法均返回新 Selection,适合函数式链式调用;
- CSS 选择器语法严格遵循 CSS3 规范,不支持 jQuery 特有伪类(如 :visible),但基础功能全覆盖。
掌握 goquery 后,HTML 数据抓取、网页结构化提取、轻量级爬虫开发将变得简洁而稳健。











