如何在 Go 语言中使用 CSS 选择器解析 HTML 页面并提取指定元素内容

本文介绍如何在 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 数据抓取、网页结构化提取、轻量级爬虫开发将变得简洁而稳健。