Golang 中解析 HTML 的指南

Go语言爬虫:goquery 的详细使用 goquery 是 Go 语言中处理 HTML 的瑞士军刀,它将 jQuery 的语法和便利性带到了 Go 的世界里。 阅读详情

Golang 中解析 HTML 的指南

在本文中,我将向你展示如何使用内置的 net/html 包在 Go 中解析 HTML。我们会讲解基础知识,我也会介绍一些可能更适合特定任务的其他库。到最后,你将掌握解析 HTML、提取结构化数据,并使用 Go 像专业人士一样处理网页抓取的技能。让我们开始吧!

先决条件

在深入了解如何在 Go 中解析 HTML 之前,请确保你具备以下条件:

  1. 已安装 Go:如果你还没有安装 Go,请访问 Go 官方网站并按照安装说明操作。

  2. 对 Go 语法有基本了解:如果你刚接触 Go,建议先复习一下它的语法,包括如何使用包、函数和错误处理。

  3. HTML 知识:理解 HTML 结构至关重要,因为你需要识别想要提取的标签和属性。

  4. Go modules:如果你正在启动一个新项目,请通过运行 go mod init 确保项目中已初始化 Go modules。

使用 net/html 解析 HTML

Go 标准库提供了用于解析 HTML 的 net/html 包。它提供了两种主要的解析方式:tokenizer API 和 node parsing API,使其成为最佳 HTML 解析器之一。在本教程中,我们将主要关注 node parsing API,因为它提供了更高层次的抽象,也更容易使用。不过,为了完整性,我们也会简要介绍 tokenizer API。

使用 Go 解析的替代方案

目前最好的替代方案是数据集。可以阅读我关于最佳数据集网站的文章。如果你时间紧,这里是前 5 大数据集提供商的 TL;DR:

  1. Bright Data — 跨行业的可定制和预构建数据集。

  2. Statista — 面向商业和研究的广泛统计数据与报告。

  3. Datarade — 来自各类提供商的优质数据产品市场。

  4. AWS Data Exchange — 与 AWS 服务集成的第三方数据集。

  5. Zyte — 根据业务需求定制的网页抓取和自定义数据集。

我与上述任何提供商都没有关联。

步骤 1:从网页获取 HTML

要解析 HTML,你必须先从网页获取原始 HTML 内容。这是通过向你想要抓取的页面 URL 发起 HTTP 请求完成的。在 Go 中,你可以使用 net/http 包来发起 HTTP 请求。

下面是一个如何发起简单 HTTP GET 请求的示例:

package main

import (

"fmt"

"io"

"net/http"

)

func main() {

url := "https://example.com" // Replace with your target URL

resp, err := http.Get(url)

if err != nil {

fmt.Println("Error fetching URL:", err)

return

}

defer resp.Body.Close()

body, err := io.ReadAll(resp.Body)

if err != nil {

fmt.Println("Error reading response body:", err)

return

}

fmt.Println("Fetched HTML:")

fmt.Println(string(body))

}

在这段代码中,我们使用 HTTP.Get() 发送 GET 请求并检索响应正文。页面的 HTML 内容会以字符串形式打印出来。

步骤 2:使用 Node Parsing API 解析 HTML

现在我们已经有了原始 HTML,接下来解析它。net/html 包提供了一个名为 html.Parse() 的函数,它可以解析 HTML 文档并返回一个节点树。树中的每个节点都表示一个 HTML 元素、属性或一段文本。

要解析 HTML,我们将响应正文(它是一个 nio.Reader)传递给 html.Parse()。这将返回一个根节点,你可以递归遍历它来提取所需信息。

下面是一个解析 HTML 文档并打印标签名称的示例:

package main

import (

"fmt"

"net/http"

"golang.org/x/net/html"

"io"

)

func main() {

url := "https://example.com"

resp, err := http.Get(url)

if err != nil {

fmt.Println("Error fetching URL:", err)

return

}

defer resp.Body.Close()

doc, err := html.Parse(resp.Body)

if err != nil {

fmt.Println("Error parsing HTML:", err)

return

}

traverse(doc)

}

// Recursively traverse the HTML nodes and print their tag names

func traverse(n *html.Node) {

if n.Type == html.ElementNode {

fmt.Println("Tag:", n.Data)

}

for c := n.FirstChild; c != nil; c = c.NextSibling {

traverse(c)

}

}

这段代码会输出在 HTML 文档中找到的标签名称。

步骤 3:从 HTML 中提取特定数据

要提取特定数据,你需要检查 HTML 结构,并识别包含所需信息的元素。例如,你想从电商页面中提取所有产品名称、价格和图片 URL。你需要查找特定标签(例如用于产品名称的 、用于价格的 ,以及用于图片的 ),并提取其内容。

下面是一个提取产品名称、价格和图片 URL 的示例函数:

package main

import (

"fmt"

"net/http"

"golang.org/x/net/html"

"strings"

"io"

)

func main() {

url := "https://example.com/ecommerce"

resp, err := http.Get(url)

if err != nil {

fmt.Println("Error fetching URL:", err)

return

}

defer resp.Body.Close()

doc, err := html.Parse(resp.Body)

if err != nil {

fmt.Println("Error parsing HTML:", err)

return

}

processProducts(doc)

}

// Recursively process the HTML nodes to extract product details

func processProducts(n *html.Node) {

if n.Type == html.ElementNode && n.Data == "li" {

// Look for product name

var name string

var price string

var imageURL string

for c := n.FirstChild; c != nil; c = c.NextSibling {

switch c.Data {

case "h2":

if c.FirstChild != nil && c.FirstChild.Type == html.TextNode {

name = c.FirstChild.Data

}

case "span":

for _, a := range c.Attr {

if a.Key == "class" && strings.Contains(a.Val, "price") {

if c.FirstChild != nil && c.FirstChild.Type == html.TextNode {

price = c.FirstChild.Data

}

}

}

case "img":

for _, a := range c.Attr {

if a.Key == "src" {

imageURL = a.Val

}

}

}

}

fmt.Println("Product Name:", name)

fmt.Println("Price:", price)

fmt.Println("Image URL:", imageURL)

}

for c := n.FirstChild; c != nil; c = c.NextSibling {

processProducts(c)

}

}

在这个示例中,processProducts 函数会递归搜索 元素。在每个内,它会查找 (产品名称)、(价格)和 (图片 URL)。然后提取相关文本或属性,并打印这些信息。

步骤 4:处理错误和边缘情况

处理 HTML 时,你会遇到一些边缘情况,例如缺少标签、空属性或格式不正确的 HTML。优雅地处理错误并确保你的爬虫工具能够应对这些场景非常重要。

例如,从节点提取文本时,始终检查该节点是否有子节点,以及子节点是否为文本节点。同样,在提取属性(例如用于图片的 src)时,请确保该属性存在后再使用。

if n.FirstChild != nil && n.FirstChild.Type == html.TextNode {

fmt.Println("Text:", n.FirstChild.Data)

}

在 Go 中解析 HTML 的替代库

虽然 net/html 是 Go 中最常用的 HTML 解析包,但其他库也提供了额外功能或替代 API,具体是否有用取决于你的使用场景。

Goquery

Goquery 是一个流行的 Go 库,提供类似 jQuery 的语法,用于遍历和操作 HTML 文档。Goquery 基于 net/html 包构建,但提供了更便捷的 API,让你可以使用 CSS 选择器查询元素。这使得无需手动遍历 HTML 树也能更轻松地提取特定数据。

下面是一个使用 Goquery 从页面中提取产品名称的示例:

package main

import (

"fmt"

"github.com/PuerkitoBio/goquery"

"net/http"

)

func main() {

url := "https://example.com/ecommerce"

res, err := http.Get(url)

if err != nil {

fmt.Println("Error:", err)

return

}

defer res.Body.Close()

doc, err := goquery.NewDocumentFromReader(res.Body)

if err != nil {

fmt.Println("Error parsing HTML:", err)

return

}

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

name := s.Find("h2").Text()

fmt.Println("Product Name:", name)

})

}

Goquery 允许你使用 CSS 选择器轻松选择元素,例如 doc.Find(“li h2”).Text(),让代码更简洁,也更易读。

其他库

  • Go-html-transform:这个库提供了一个 API,可使用 CSS 选择器转换 HTML 文档,类似于 Goquery,但采用不同的方法。不过,它已不再积极维护。

  • Html2go:这个工具主要将 HTML 文件转换为 Go 代码(structs)。如果你需要静态定义 HTML 文档结构,它会很有用。

结论

使用 net/html 包在 Go 中解析 HTML 非常简单。你可以获取原始 HTML,并使用 html.Parse() 遍历 HTML 树,获取所需数据。如果你想要更方便的方式,Goquery 这类库提供了类似 jQuery 的功能,让处理 HTML 变得更轻松。无论你是在构建一个快速的网页爬虫工具,还是投入一个更大型的网页爬取项目,Go 的库和并发特性都使其成为高效处理 HTML 解析的可靠选择。

有问题吗?请在评论中告诉我!

对其他网页抓取指南感兴趣?

更多精彩文章,请访问我的个人资料 — Data Journal ❤️

Gin入门指南:从零开始快速掌握Go Web框架Gin 中间件函数用于记录日志。路由和请求处理:Gin 提供了简单而灵活的路由功能,可以方便地定义不同URL路径的处理函数,并支持 GET、POST 等各种HTTP请求方法。函数用于返回成功结果,它接收 Gin 的上下文对象,以及三个自定义的参数,分别为状态码、提示信息和数据。一般来说,我们需要在处理请求的路由函数中使用 defer 语句将捕获的异常记录下来,所以我们可以通过中间件实现全局的异常处理。参数绑定和验证:Gin 提供了强大的参数绑定和验证功能,可以方便地将请求参数绑定到结构体中,并进行数据验证和转换。 阅读详情

相关推荐

基于DSP28335的Matlab/Simulink代码生成实验七:A/D采样

实验七:讲解如何使用DSP的ADC模块,通过代码生成技术控制DSP进行电流采样,是后续实现电机闭环控制的重要环节。通过简单的实验来熟悉代码生成的过程。最终实现复杂算法代码自动生成,进行高性能电机控制!

m0_73869369的博客 4724

终极Gokogiri指南:如何在Go中快速解析HTML和XML

Gokogiri是一个轻量级的libxml包装器,专门为Go语言设计,提供了强大的HTML和XML解析功能。无论你是需要从网页抓取数据、处理文档还是构建爬虫工具,Gokogiri都能帮你快速实现目标。🚀 ## 什么是Gokogiri? **Gokogiri** 是一个基于libxml2库的Go语言绑定,灵感来源于Ruby的Nokogiri API。它允许你解析、操作和创建HTML与XML文档

gitblog_01118的博客 1286

Vectorless dynamic动态功耗分析——Voltus

power 计算工具会根据设计信息和用户提供的activity和switching约束来生成虚拟的worst-case的power vector,难点在于哪些instances视为switching,在没有仿真的前提下如何确定开关的时间,使用timing文件(TWF)

qq_44347276的博客 2789

深入解析gomponents:用纯Go构建HTML组件的终极指南

在现代Web开发中,HTML模板引擎层出不穷,但大多数都采用特定的模板语法。gomponents项目提供了一种全新的思路——完全使用Go语言来构建HTML组件。本文将全面剖析这个创新库的核心概念、使用方法和最佳实践。 ## 什么是gomponents? gomponents是一个纯Go实现的HTML组件库,它允许开发者使用Go语言原生语法来构建HTML结构。与传统模板引擎不同,gomponen...

gitblog_01017的博客 436

深入理解C++23的Deducing this特性(上):基础概念与语法详解

C++23标准中引入的"Deducing this"特性是一项重大革新,它不仅改变了我们编写成员函数的方式,还为模板元编程和设计模式实现带来了新的可能。

weixin_61470881的博客 1332

STM32F407 HAL库 LIN DMA 配置实战与汽车电子应用解析

本文详细解析了STM32F407 HAL库在LIN总线通信中的DMA配置实战,重点介绍了硬件自动处理断点检测、同步场和校验和的优势。通过具体代码示例和汽车电子应用案例(如车窗控制、座椅调节),阐述了如何利用DMA提升通信效率与稳定性,为成本敏感的汽车电子系统提供高效解决方案。

study的专栏 968

深入解析 Blackfriday v2:Go 语言 Markdown 解析与 HTML 渲染的实战指南

Blackfriday 是一个用 Go 实现的 Markdown 处理器,本指南以 Kubernetes 仓库中 vendored 的 [vendor/github.com/russross/blackfriday/v2/README.md](https://link.gitcode.com/i/d967ecdc79716339abd4bcf5a95ca402) 为主体,结合其 [v2 源码](h

gitblog_00778的博客 304

五段式S型算法笔记

又因为有 v-v0= 0.5jt通式: 所以有 vm-v0= 0.5jtm 所以有4vm-4v0= 2jtm。算法1: v=2vm-v0-0.5*jt+2jt*tm-2jtm*tm。加加速度j 自己设置 已知,vmax自己设置已知;所以有4vm-4v0= 2jtm带入算法1。

qq_36658033的博客 681

gh_mirrors/xpath/xpath完全指南:如何用Go轻松解析XML、HTML与JSON文档

你是否正在寻找一个功能强大且易于使用的Go语言XPath库?gh_mirrors/xpath/xpath项目为你提供了完整的解决方案!这个强大的Go包让你能够轻松地从XML、HTML和JSON文档中选择节点,使用标准的XPath表达式进行查询。无论你是Web爬虫开发者、数据提取专家,还是需要处理结构化文档的程序员,这个库都能帮助你快速高效地完成任务。 ## 什么是XPath?为什么选择这个库?

gitblog_01179的博客 1042

MAX96724解串器拨码配置实战:从COAX/GMSL2模式到IIC地址设定

本文详细解析了MAX96724解串器的拨码配置方法,涵盖电源管理模式、I2C地址设定及COAX/GMSL2视频传输模式。通过实战案例和故障排查技巧,帮助工程师快速掌握xcDeserializer4.0版本的配置要点,避免常见错误,提升车载摄像头和工业视觉系统的调试效率。

weixin_29243279的博客 576

H3C交换机命令大全,分模块好记忆!

在深入命令之前,我们先来了解H3C交换机的命令行基础。<H3C>[H3C]常用基础命令如下:这些基础命令是操作H3C交换机的敲门砖,熟练掌握后,我们将按模块深入探讨更具体的配置命令。H3C交换机的命令可以按功能模块分类,包括系统管理、接口配置、VLAN操作、链路聚合、路由配置、安全管理等。

网络技术联盟站 782

AssetStudio 实战指南:如何一次解出 Unity 游戏资源

游戏里抠出来的 `.asset` 文件用文本编辑器打开,看到的是一串乱码。[AssetStudio](https://link.gitcode.com/i/84f176273cd27a726fcdd2ee69a0c40b) 就是为 Unity 资源解包而做的工具:加载文件后自动判断格式、拆开内容,贴图给你 PNG,模型给你 OBJ 或 FBX,音频给你 WAV,游戏数据给你 JSON,支持 Uni

gitblog_00666的博客 58

【AIGC】大模型面试高频考点09-大模型Agent框架

聚焦AIGC专业技术分享

一个内容严谨、方向前沿、极具实践价值的AI大模型技术分享站 1966

深入解析 goquery v1.5.0:在 Go 中像 jQuery 一样操作 HTML 文档的实战指南

goquery 是为 Go 语言设计的 HTML 文档查询与操作库,它把 jQuery 的链式语法与选择器风格带入了 Go 生态。本文以 KubeSphere 仓库中 vendored 的 goquery v1.5.0 及其 [官方 README](https://link.gitcode.com/i/dd37cfde697438283c6830130f3c1933) 为主体,系统讲解它的设计理念

gitblog_00164的博客 339

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【亲测免费】 HTML到Markdown转换器:html2md详尽安装与配置指南

HTML到Markdown转换器:html2md详尽安装与配置指南 项目基础介绍及编程语言 html2md 是一个由 优快云 公司开发的InsCode AI大模型提及的开源项目,它致力于将HTML格式的内容转换成Markdown格式。项目采用Go语言进行编写,这使得它轻量且高效,适合处理各种网页内容至文本格式的需求。 关键技术和框架 本项目基于Johannes Kaufmann的html-to-...

gitblog_01230的博客 1600

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

go爬虫和python爬虫_Go语言实战爬虫项目

Go语言爬虫框架之Colly和GoqueryPython爬虫框架比较多有requests、urllib, pyquery,scrapy等,解析库有BeautifulSoup、pyquery、Scrapy和lxml等等,基于Go的爬虫框架是比较强健的,尤其Colly和Goquery是比较强大的工具,其灵活性和 表达性都比较优秀。网络爬虫网络爬虫是什么?从本质上讲,网络爬虫的工作原理通过检查web页面...

weixin_39784972的博客 550

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

go语言爬虫解析html,Golang如何解析Html代码

搜索热词Golang如何解析HTML代码用Golang的朋友都知道如果我们要从HTML中提取一些内容、比如title或者是h2在或者是一些其他的HTML的内容、在Golang里面我们如果要自己写代码来提取还是相当的麻烦的;由于我之前在写Pyhon的爬虫的时候也需要解析HTML标签;所以用过PyQuery和BS4.这次在用Golang写爬虫的时候就留意了一下是否有Golang版本的Query。git...

weixin_42202605的博客 2479

lazydocker 中的 Go 字符串库 str:vendor 依赖下 70+ 字符串函数的完整解析与管道化实战

本篇技术指南聚焦于 lazydocker 仓库以 vendor 方式携带的 Go 字符串工具库 `str`(`vendor/github.com/mgutz/str`,在 `go.mod` 中锁定为 `github.com/mgutz/str v1.2.0`)。文章完整继承并扩展其 API 文档,系统讲解它的纯函数设计、`F` 后缀的 Filter 闭包、`Pipe` 管道化组合,以及在 lazy

gitblog_00194的博客 354

soup核心API深度解析:从HTML解析到元素遍历的终极指南

soup是一个用Go语言编写的Web Scraping库,类似于Python的BeautifulSoup,提供了简洁高效的HTML解析和元素操作API。本文将全面介绍soup的核心功能,帮助开发者快速掌握从网页抓取到数据提取的完整流程。 ## 快速入门:安装与基础使用 要开始使用soup,首先需要通过以下命令安装: ```bash go get github.com/anaskhan96/s

gitblog_00299的博客 952

go语言提取html,Golang如何解析Html代码

Golang如何解析Html代码用Golang的朋友都知道如果我们要从HTML中提取一些内容、比如title或者是h2在或者是一些其他的HTML的内容、在Golang里面我们如果要自己写代码来提取还是相当的麻烦的;由于我之前在写Pyhon的爬虫的时候也需要解析HTML标签;所以用过PyQuery和BS4.这次在用Golang写爬虫的时候就留意了一下是否有Golang版本的Query。github是...

weixin_32349561的博客 2306

如何使用 Golang 解析 HTML?

现在你已经了解了如何使用 Go 解析 HTML。Node Parser 适用于完整页面遍历,Tokenizer 更便于处理大型页面中特定数据提取。想要更多功能,可以尝试第三方工具。AmazonLinkedIn如何使用 Golang 解析 HTML?t=P1C7亮数据-网络IP代理及全网数据一站式服务商屡获殊荣的代理网络、强大的数据挖掘工具和现成可用的数据集。亮数据:网络数据平台领航者https://www.bright.cn?

亮数据 Bright Data 的博客 1198

golang解析html网页

1.先看一下整个结构: 主要是web和html目录,分别存放go代码和html相关的资源文件。 2.html代码比较简单,代码如下: Go web 用户名: 密码: 就是显示一张图片,然后加登陆表单。 3.而go代码也比较简单,如下: package main import ( "fmt" "h

rambo_huang的博客 1万+

golang转word到html,golang 解析word文档操作

baliance/gooxmlgooxml是可以对整个office document提供支持的golang库,功能很强大,这里简单给出对word文档的读取案例安装go get baliance.com/gooxml/go build -i baliance.com/gooxml/…解析word代码package mainimport ("fmt""log""baliance.com/gooxml/...

weixin_39817391的博客 1769

go语言解析html

转载地址:https://studygolang.com/articles/4602 有两个不错的库: https://github.com/PuerkitoBio/goquery 一个是 http://code.google.com/p/go.net/html html是html的解析器,把html文本解析出来,goquery基于html包,在此基础上结合cascadia包(一个css选择器工具),实现类似于jquery的功能,操作html非常方便。 使用goquery来查找,选择相应的ht.

笔记 6535

如何将 iPhone 备份到 iCloud?

iCloud 是苹果公司提供的云存储服务,可帮助 iPhone 用户将重要数据保存到云端。启用 iCloud 云备份后,即使您的 iPhone 丢失、损坏或需要恢复出厂设置,您也可以使用之前创建的备份将受支持的数据恢复到设备上。帮助保存设备设置、应用程序数据、主屏幕布局、消息历史记录和其他信息,降低手机丢失或损坏时数据丢失的风险。启用 iCloud 自动备份后,您的 iPhone 会在满足所需条件时自动创建备份,这样您就不必每次都手动操作。

Digitally的博客 246
上一篇: 用于网页抓取的 Node-unblocker
下一篇: Golang 中解析 HTML 的指南
Data_Journal
博客等级 码龄1年 158粉丝 112原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值