
本文介绍如何在 go 中借助 goquery 库,通过类似 jquery 的 css 选择器(如 `.funcname`)高效解析 html 页面并提取目标元素的文本内容或属性值。
在 Go 语言生态中,原生 net/html 包虽功能完备,但直接操作 DOM 节点较为繁琐。更推荐使用成熟的第三方库 github.com/PuerkitoBio/goquery,它提供链式、jQuery 风格的 API,支持标准 CSS 选择器(如类名 .funcname、ID #header、标签 div、组合选择器 div.funcname a 等),极大简化 HTML 解析流程。
快速开始:安装与基础用法
首先安装 goquery:
go get github.com/PuerkitoBio/goquery
以下是一个完整示例:从 HTML 字符串中提取所有具有 class="funcname" 的
package main
import (
"fmt"
"strings"
"github.com/PuerkitoBio/goquery"
)
func main() {
html := `
fmt.Println
log.Printf
os.OpenFile
`
doc, err := goquery.NewDocumentFromReader(strings.NewReader(html))
if err != nil {
panic(err)
}
// 查找所有 class="funcname" 的元素
doc.Find(".funcname").Each(func(i int, s *goquery.Selection) {
text := strings.TrimSpace(s.Text()) // 去除首尾空白
fmt.Printf("第 %d 个 funcname: %s\n", i+1, text)
})
}
// 输出:
// 第 1 个 funcname: fmt.Println
// 第 2 个 funcname: os.OpenFile进阶技巧
- 获取属性值:使用 Attr() 方法,例如 s.Attr("id") 或 s.Attr("data-value");
- 获取 HTML 内容(含标签):用 Html();
- 从远程 URL 解析:直接调用 goquery.NewDocument("https://example.com")(自动发起 HTTP 请求);
-
处理空匹配:Find() 总是返回非 nil 的 Selection,建议用 Length() 判断是否找到元素:
if doc.Find(".funcname").Length() == 0 { fmt.Println("未找到匹配的 .funcname 元素") }
注意事项
- goquery 依赖 net/html,对 malformed HTML 具有较强容错性,但仍建议确保输入 HTML 结构基本合理;
- 若需并发解析多个页面,请注意 goquery.Document 不是 goroutine 安全的,每个 goroutine 应独立创建 Document 实例;
- 对于超大 HTML 文件,可考虑流式解析(配合 goquery.NewDocumentFromReader + io.Reader)以控制内存占用。
掌握 goquery 后,HTML 抓取、数据清洗和简单爬虫开发将变得直观而可靠——CSS 选择器即代码,所见即所得。
立即学习“前端免费学习笔记(深入)”;











