Golang解析HTML的实战指南

 更新时间:2026年03月09日 08:34:35   作者:程序员爱钓鱼  
在做HTML 数据抓取、自动化数据采集时,Go 语言中最常用的 HTML 解析库之一就是github.com/Pue,rkitoBio/goquery,下面小编就和大家详细介绍一下它的具体使用吧

在做HTML 数据抓取、自动化数据采集时,Go 语言中最常用的 HTML 解析库之一就是:github.com/PuerkitoBio/goquery

它提供了类似 JavaScript 中 jQuery 的 DOM 操作方式,使得 HTML 解析变得非常直观和高效。

一、goquery 是什么

goquery 是一个 Go 语言的 HTML 文档解析和 DOM 操作库,由 Martin Angers 开发维护。

该库的设计理念是:

在 Go 中实现类似 jQuery 的 DOM 选择和操作方式。

核心特点:

  • 使用 CSS Selector 选择元素
  • API 风格类似 jQuery
  • 基于 Go 标准库 HTML 解析器
  • 操作简单且性能稳定

goquery 的底层解析器来自 Go 官方 HTML 解析库:golang.org/x/net/html

二、为什么使用 goquery

在 Go 中解析 HTML 有多种方式:

  • 使用正则表达式
  • 使用 golang.org/x/net/html
  • 使用 goquery

其中 goquery 的优势非常明显。

使用正则解析 HTML:

  • 代码复杂
  • 容易出错
  • 不适合复杂结构

使用 html 原生解析:

  • API 偏底层
  • 操作较繁琐

goquery 提供了更高级的 DOM 查询接口,使 HTML 解析更接近前端开发体验。

三、安装 goquery

在 Go 项目中安装:

go get github.com/PuerkitoBio/goquery

导入库:

import "github.com/PuerkitoBio/goquery"

四、解析 HTML 文档

最基础的使用方式是解析 HTML 字符串或网页。

示例:

package main

import (
    "fmt"
    "strings"

    "github.com/PuerkitoBio/goquery"
)

func main() {

    html := `
    <html>
    <body>
    <div class="title">Hello GoQuery</div>
    </body>
    </html>
    `

    doc, err := goquery.NewDocumentFromReader(strings.NewReader(html))
    if err != nil {
        panic(err)
    }

    text := doc.Find(".title").Text()

    fmt.Println(text)
}

输出:

Hello GoQuery

五、从网页 URL 直接解析

goquery 提供了一个非常方便的函数,可以直接解析网页。

package main

import (
    "fmt"

    "github.com/PuerkitoBio/goquery"
)

func main() {

    doc, err := goquery.NewDocument("https://example.com")
    if err != nil {
        panic(err)
    }

    fmt.Println(doc.Find("title").Text())
}

适用于:

  • • 简单爬虫
  • • 快速数据采集

不过在生产环境中通常建议使用自定义 HTTP 请求。

六、使用 CSS 选择器

goquery 支持常见的 CSS Selector。

例如:

选择 class

doc.Find(".product")

选择 id

doc.Find("#main")

选择标签

doc.Find("a")

组合选择

doc.Find("div.product a.title")

属性选择

doc.Find("img[data-src]")

这些写法与 jQuery 几乎一致。

七、遍历元素

在抓取数据时,经常需要遍历列表元素。

示例:

doc.Find(".item").Each(func(i int, s *goquery.Selection) {

    title := s.Find(".title").Text()

    link, _ := s.Find("a").Attr("href")

    fmt.Println(title, link)

})

Each 会遍历所有匹配的元素。

八、读取元素属性

例如读取图片地址:

src, exists := doc.Find("img").Attr("src")

if exists {
    fmt.Println(src)
}

常见属性:

  • href
  • src
  • data-*

九、修改 HTML 内容

goquery 不仅可以读取,还可以修改 DOM。

修改文本:

doc.Find(".title").SetText("New Title")

添加属性:

doc.Find("img").SetAttr("alt", "image")

删除元素:

doc.Find(".ad").Remove()

十、获取完整 HTML

如果修改了 HTML,可以重新输出。

html, err := doc.Html()

也可以输出某个节点:

html, err := doc.Find(".content").Html()

十一、完整爬虫示例

下面是一个简单的网页抓取示例。

package main

import (
    "fmt"
    "net/http"

    "github.com/PuerkitoBio/goquery"
)

func main() {

    resp, err := http.Get("https://example.com")
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()

    doc, err := goquery.NewDocumentFromReader(resp.Body)
    if err != nil {
        panic(err)
    }

    doc.Find("a").Each(func(i int, s *goquery.Selection) {

        text := s.Text()

        link, _ := s.Attr("href")

        fmt.Println(text, link)

    })
}

这个程序会抓取页面中所有链接。

十二、性能建议

在大规模爬虫项目中,可以做以下优化:

  • 使用 HTTP 连接池
  • 并发抓取多个页面
  • 减少不必要的 DOM 查询
  • 提前筛选 HTML 结构

goquery 本身性能不错,但 HTML 解析仍然属于 CPU 密集操作。

十三、典型应用场景

goquery 非常适合以下场景:

  • SEO 数据采集
  • 电商商品抓取
  • 新闻内容采集
  • HTML 数据提取
  • 自动化测试

例如抓取:

  • 商品标题
  • 商品价格
  • 图片链接
  • 文章正文

十四、常见问题

HTML 解析失败

原因通常是 HTML 不完整,可以先打印 HTML 内容确认。

网页需要 JavaScript

goquery 只能解析静态 HTML。

如果网页依赖 JavaScript 渲染,需要使用浏览器自动化工具

例如:Chromium或无头浏览器方案。

十五、总结

github.com/PuerkitoBio/goquery 是 Go 生态中最流行的 HTML 解析库之一。

主要优势:

  • jQuery 风格 API
  • 支持 CSS Selector
  • 使用简单
  • 适合爬虫开发

对于需要抓取网页结构化数据的 Go 项目来说,goquery 是一个非常高效且成熟的解决方案。

以上就是Golang解析HTML的实战指南的详细内容,更多关于Golang解析HTML的资料请关注脚本之家其它相关文章!

相关文章

  • Go语言面试题之select和channel的用法

    Go语言面试题之select和channel的用法

    金九银十面试季到了(PS:貌似今年一年都是面试季),就业环境很差,导致从业人员不得不卷。本文将重点讲解一下Go面试进阶知识点之select和channel,需要的可以参考一下
    2022-09-09
  • go语言同步教程之条件变量

    go语言同步教程之条件变量

    这篇文章主要给大家介绍了关于go语言同步教程之条件变量的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-07-07
  • golang中context的作用详解

    golang中context的作用详解

    这篇文章主要介绍了golang中context的作用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • go货币计算时如何避免浮点数精度问题

    go货币计算时如何避免浮点数精度问题

    在开发的初始阶段,我们经常会遇到“浮点数精度”和“货币值表示”的问题,那么在golang中如何避免这一方面的问题呢,下面就跟随小编一起来学习一下吧
    2024-02-02
  • Go设计模式原型模式考查点及使用详解

    Go设计模式原型模式考查点及使用详解

    这篇文章主要为大家介绍了Go设计模式原型模式考查点及使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • Go 值传递与引用传递的方法

    Go 值传递与引用传递的方法

    这篇文章主要介绍了Go 值传递与引用传递的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-03-03
  • Go语言hello world实例

    Go语言hello world实例

    这篇文章主要介绍了Go语言hello world实例,本文先是给出了hello world的代码实例,然后对一些知识点和技巧做了解释,需要的朋友可以参考下
    2014-10-10
  • 用go语言实现WebAssembly数据加密的示例讲解

    用go语言实现WebAssembly数据加密的示例讲解

    在Web开发中,有时候为了提升安全性需要对数据进行加密,由于js代码相对比较易读,直接在js中做加密安全性较低,而WebAssembly代码不如js易读,本文提供一个用go语言实现的WebAssembly数据加密示例,需要的朋友可以参考下
    2024-03-03
  • 正则表达式在Go字符串处理中的实战应用代码

    正则表达式在Go字符串处理中的实战应用代码

    在Go语言中,正则表达式与字符串处理是强大的工具,能够大幅提升文本处理效率,下面这篇文章主要介绍了正则表达式在Go字符串处理中实战应用的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2026-03-03
  • Go语言实现广播式并发聊天服务器

    Go语言实现广播式并发聊天服务器

    本文主要介绍了Go语言实现广播式并发聊天服务器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-08-08

最新评论