
本文介绍如何在 go 中借助 goquery 库,通过 css 选择器(如 `.funcname`)高效解析 html 文档并提取目标元素的文本内容或属性值,适用于爬虫、页面数据抽取等场景。
在 Go 生态中,原生 net/html 包虽可解析 HTML,但操作繁琐、缺乏类似 jQuery 的链式查询能力。推荐使用成熟、轻量且语法直观的第三方库 —— github.com/PuerkitoBio/goquery,它封装了 net/html,提供类 jQuery 的 CSS 选择器支持,大幅提升开发效率。
快速上手:提取具有 class="funcname" 的 div 文本内容
首先安装依赖:
go get github.com/PuerkitoBio/goquery
以下是一个完整示例,演示如何从 HTML 字符串中提取所有 class="funcname" 的
package main
import (
"fmt"
"strings"
"github.com/PuerkitoBio/goquery"
)
func main() {
html := `
API Reference
ParseHTML
FindElement
`
doc, err := goquery.NewDocumentFromReader(strings.NewReader(html))
if err != nil {
panic(err)
}
// 使用 CSS 选择器查找所有 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: ParseHTML
// 第 2 个 funcname: FindElement
})
}常用操作扩展
- ✅ 获取属性值:s.Attr("id") 或 s.AttrOr("data-name", "default")
- ✅ 获取 HTML 内容(含标签):s.Html()
- ✅ 获取纯文本(自动去空格/换行):s.Text()(推荐配合 strings.TrimSpace)
- ✅ 链式筛选:doc.Find("div.funcname").Find("span.code").Text()
- ✅ 从 URL 加载:goquery.NewDocument("https://example.com")(需确保网络可达且目标页允许爬取)
注意事项
- goquery.NewDocument() 默认会发起 HTTP 请求,若解析本地 HTML 字符串,请使用 NewDocumentFromReader(io.Reader) 避免误触发网络调用;
- HTML 若存在严重语法错误(如未闭合标签),goquery 通常能容错处理,但仍建议对关键字段做 s.Length() > 0 判断,避免空选择器导致 panic;
- 生产环境抓取网页时,请遵守 robots.txt 协议、设置合理 User-Agent 及请求间隔,尊重网站服务条款。
掌握 goquery 的 CSS 选择器能力,即可快速构建健壮、可维护的 HTML 数据提取逻辑,是 Go 开发者处理 Web 内容不可或缺的实用技能。
立即学习“前端免费学习笔记(深入)”;











