Golang 中解析 HTML 的指南

【golang】实现一个 html 解析器 【golang】实现一个 html 解析器 今天发现 golang 中提供的 xml 包可以方便的帮助我们解析标记语言,所以,我们可以很方便的就实现一个 html 的解析器。 先来看一下数据结构 type Node interface {} type Element struct { tagName string attrs []xml.Attr children []Node } 之所... 阅读详情

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 ❤️

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

相关推荐

Gin入门指南:从零开始快速掌握Go Web框架Gin

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

赵士杰——成功并非一蹴而就,而是在持之以恒的努力中逐渐实现。 3085

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

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

gitblog_01118的博客 1286

esim分布式云卡池技术

eSIM卡,即Embedded-SIM,嵌入式SIM卡。eSIM卡的概念就是将传统SIM卡直接嵌入到设备芯片上,而不是作为独立的可移除零部件加入设备中,用户无需插入物理SIM卡。这一做法将允许用户更加灵活的选择运营商套餐,或者在无需解锁设备、购买新设备的前提下随时更换运营商。未来通用的eSIM标准建立将为普通消费者、企业用户节省更多移动设备使用成本,并带来更多的便利、安全性。 2018年 3月7日,中国联通宣布,正式在上海、天津、广州、深圳、郑州、长沙6座城市率先启动“eSIM一号双终端”业务的办理。[.

著名博客 3708

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

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

gitblog_01017的博客 436

手把手教你用EGM96模型校正DEM数据(含在线工具推荐)

本文详细介绍了如何使用EGM96地球重力场模型校正DEM数据中的高程偏差。通过对比WGS84椭球面与大地水准面的差异,解释了校正原理,并提供了从在线工具快速验证到Python脚本批量处理的全流程实战指南,帮助GIS开发者和数据分析师确保高程数据基准一致,提升空间分析精度。

ttt77的博客 1007

Facebook登录协议逆向实战:从加密参数到完整流程解析(附Python代码)

本文深入解析Facebook登录协议的逆向工程,重点拆解`lgndim`和`encpass`等加密参数的生成逻辑,并提供完整的Python实现代码。通过Base64解码和RSA加密技术,帮助开发者理解并实现Facebook登录流程,同时涵盖工程优化与安全实践。

weixin_30687051的博客 476

深入解析 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

使用Python开发TreeATE的测试脚本常见问题

ImportError: No module named py_compile 找不到 DevLangPython3.dll 以上2个问题都是没有安装正确的Python,当前TreeATE依赖32位Python 2.7版本,暂时不支持Python 3以上版本

蓝白云的专栏 1032

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

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

gitblog_01179的博客 1042

python 识别滑块验证码

博客来源于: https://www.cnblogs.com/wyh0923/p/16528354.html # -*- coding: utf-8 -*- # https://gov.pkulaw.cn/ 1. import io 2. import json 3. from pathlib import Path 4. from PIL import Image 5. import bas...

2102

RTK_ROS_导航(4):接入move_base

现在我们要将之前的数据接入到Move_base中,使得机器人能够根据Map上的终点进行导航,并且实现避障效果如下图。

旋风小短腿 1946

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

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

gitblog_00666的博客 58

浏览器主页被2345劫持简单处理方法

本人比较常用的浏览器是IE和Chrome IE: 将网址修改为https://www.baidu.com 应用-确定-重新打开IE浏览器 或者win+r运行regedit打开注册表找到这个值   HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main下  和HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Main这个下面的StartPage ...

A soul tortured by desire 2万+

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

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

gitblog_01230的博客 1600

JAVA:Spring Boot3 集成 Spring AI 实现 Skill 开发

本文介绍了如何通过Spring Boot和Spring AI实现大模型技能(Skill)开发,让AI具备调用业务系统能力。文章首先解释了Skill的概念,即AI可调用的业务能力,如查询订单、天气等,并展示了执行流程和整体架构。然后详细介绍了实践样例,包括技术版本、Maven依赖配置、AI服务设置、ChatClient创建和Skill技能注册中心的实现。注册中心提供了技能的注册、查询、启用/禁用等功能,支持按类别管理技能,并能够获取所有可用技能列表。通过这种方式,开发者可以轻松为大模型扩展业务功能调用能力。

木头 622

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

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

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

weixin_39784972的博客 550

VC中sqlite的使用

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

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

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

weixin_42202605的博客 2479

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

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

Redis 从 0 到 1(二十七):JSON 体积是 Protobuf 的 3.7 倍?3 种序列化的 Go 基准测试

缓存对象直接用 json.Marshal,1 亿条 key 多花 20G 内存和 3 倍带宽。本文对 JSON / MessagePack / Protobuf 做 Go 基准测试(体积、编解码耗时、CPU),给出不同场景的选型表和统一序列化封装。

2501_92769340的博客 174
上一篇: Golang 中解析 HTML 的指南
下一篇: Playwright vs Selenium:哪个是最佳无头浏览器
Data_Journal
博客等级 码龄1年 158粉丝 112原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值