
本文介绍如何使用 go 语言(通过 goquery 库)高效解析 html 页面,利用类似 jquery 的 css 选择器语法精准提取具有特定类名(如 `.funcname`)的 dom 元素文本或属性值。
在 Go 生态中,原生 net/html 包虽可解析 HTML,但操作繁琐、缺乏选择器支持;而 goquery 是业界广泛采用的轻量级 HTML 解析库,它基于 net/html 构建,并提供与 jQuery 高度兼容的链式 API,极大简化了 DOM 查询与数据抽取流程。
✅ 快速上手:安装与基础用法
首先安装 goquery:
go get github.com/PuerkitoBio/goquery
以下是一个完整示例:从 HTML 字符串中提取所有
package main
import (
"fmt"
"strings"
"github.com/PuerkitoBio/goquery"
)
func main() {
html := `
ParseHTML
Ignore me
ExtractValue
`
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: "ParseHTML"
// 第 2 个 funcname: "ExtractValue"
})
}? 进阶技巧:获取属性、HTML 或遍历子节点
-
获取元素属性(如 id、data-value):
立即学习“前端免费学习笔记(深入)”;
id, exists := s.Attr("id") if exists { fmt.Println("ID:", id) } -
提取原始 HTML 内容(含标签):
htmlContent, _ := s.Html() fmt.Println("Inner HTML:", htmlContent) -
查找嵌套结构(如 .funcname > code):
doc.Find(".funcname code").Text()
⚠️ 注意事项
- goquery.NewDocument() 默认发起 HTTP 请求,若解析本地 HTML 字符串或 io.Reader,请使用 NewDocumentFromReader(),避免误触发网络调用;
- HTML 若未规范闭合或含编码问题(如非 UTF-8),建议先用 golang.org/x/net/html/charset 自动检测并转换;
- 在高并发场景下,每个 goroutine 应独立创建 *goquery.Document,因其不保证并发安全。
掌握 goquery 的 CSS 选择器能力,可让 Go 在网页抓取、模板预渲染、自动化测试断言等场景中兼具性能与开发效率。











