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重试机制代码更可靠

    使用Go重试机制代码更可靠

    这篇文章主要为大家介绍了使用Go重试机制的使用,使你的代码更加可靠,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Go语言append切片添加元素的实现

    Go语言append切片添加元素的实现

    本文主要介绍了Go语言append切片添加元素的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • 使用Go语言实现并发处理CSV文件到数据库

    使用Go语言实现并发处理CSV文件到数据库

    Go 语言的 goroutine 和通道(channel)非常适合用来并发地处理数据,本文将通过简单示例介绍一下如何使用Go语言并发地处理 CSV 文件并将数据插入到数据库中,感兴趣的可以了解下
    2025-01-01
  • 使用Golang Validator包实现数据验证详解

    使用Golang Validator包实现数据验证详解

    在开发过程中,数据验证是一个非常重要的环节,而golang中的Validator包是一个非常常用和强大的数据验证工具,提供了简单易用的API和丰富的验证规则,下面我们就来看看Validator包的具体使用吧
    2023-12-12
  • golang利用不到20行代码实现路由调度详解

    golang利用不到20行代码实现路由调度详解

    这篇文章主要给大家介绍了关于golang利用不到20行代码实现路由调度的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-08-08
  • Golang中Channel实战技巧与一些说明

    Golang中Channel实战技巧与一些说明

    channel是Go语言内建的first-class类型,也是Go语言与众不同的特性之一,下面这篇文章主要给大家介绍了关于Golang中Channel实战技巧与一些说明的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-11-11
  • 深入理解Go Gin框架中间件的实现原理

    深入理解Go Gin框架中间件的实现原理

    在Go Gin框架中,中间件是一种在请求处理过程中插入的功能模块,它可以用于处理请求的前置和后置逻辑,例如认证、日志记录、错误处理等,本文将给大家介绍一下Go Gin框架中间件的实现原理,需要的朋友可以参考下
    2023-09-09
  • 使用Go语言自制简单易用的Web框架

    使用Go语言自制简单易用的Web框架

    这篇文章主要为大家详细介绍了如何使用Go语言实现自制简单易用的Web框架,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-01-01
  • Go Plugins插件的实现方式

    Go Plugins插件的实现方式

    目前 Plugins 仅在 Linux、FreeBSD 和 macOS 上受支持,且只支持 golang 调用,今天通过本文给大家介绍Go Plugins插件的实现方式,感兴趣的朋友一起看看吧
    2021-08-08
  • Go语言操作Excel的实现示例

    Go语言操作Excel的实现示例

    excelize是一个功能丰富且易于使用的Go语言库,它极大地简化了Excel文件的读写操作,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-12-12

最新评论