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

本文介绍如何使用 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 在网页抓取、模板预渲染、自动化测试断言等场景中兼具性能与开发效率。