【Go语言爬虫系列02】HTML解析与Goquery技术详解

用Go来爬虫 goquery使用 应工作内容需求,要爬取两个网站的数据(至于是什么网站,这里就不透露了,哈哈,害怕被发现了封ip),这些数据是定期更新的。由于后端的所有服务都是用go写的,于是不打算用python,还是想用go来完成这个需求,github里搜了下,发现goquery这个爬虫包用的人还挺多的,5000多个star,而且是BSD开源协议,于是毫不犹豫的拿来用了。 首先,go get https://github.co... 阅读详情

📚 原创系列: “Go语言爬虫系列”

🔄 转载说明: 本文最初发布于"Gopher部落"微信公众号,经原作者授权转载。

🔗 关注原创: 欢迎扫描文末二维码,关注"Gopher部落"微信公众号获取第一手Go技术文章。

📑 Go语言爬虫系列导航

本文是【Go语言爬虫系列】的第2篇,点击下方链接查看更多文章

🚀 Go爬虫系列:共12篇
  1. 爬虫入门与Colly框架基础
  2. HTML解析与Goquery技术详解👈 当前位置
  3. Colly高级特性与并发控制
  4. 爬虫架构设计与实现(即将发布)
  5. 反爬虫策略应对技术(即将发布)
  6. 模拟登录与会话维持(即将发布)
  7. 动态网页爬取技术(即将发布)
  8. 分布式爬虫设计与实现(即将发布)
  9. 数据存储与处理(即将发布)
  10. 爬虫性能优化技术(即将发布)
  11. 爬虫安全与合规性(即将发布)
  12. 综合项目实战:新闻聚合系统(即将发布)

📖 文章导读

在上一篇文章中,我们学习了爬虫的基本概念和Colly框架的基础用法。本文作为系列的第二篇,将深入HTML解析领域,重点介绍:

  1. HTML文档结构与DOM树的基本概念
  2. Goquery库的安装与核心功能
  3. CSS选择器语法与高级用法
  4. DOM元素遍历与精准选择技术
  5. 结构化数据提取与表格处理实战

掌握这些技术后,您将能够从任何HTML页面中精确提取所需的数据,无论它的结构多么复杂。

一、HTML文档结构与DOM基础

1.1 理解HTML与DOM

在深入学习HTML解析技术前,我们需要先理解HTML文档的结构和DOM(文档对象模型)的概念:

**HTML(超文本标记语言)**是网页的标准结构化语言,由一系列元素(elements)组成,这些元素通过标签(tags)来定义。例如:

<!DOCTYPE html>
<html>
<head>
  <title>页面标题</title>
</head>
<body>
  <div id="main">
    <h1 class="title">标题文本</h1>
    <p>段落内容</p>
    <ul>
      <li>列表项1</li>
      <li>列表项2</li>
    </ul>
  </div>
</body>
</html>

**DOM(Document Object Model,文档对象模型)**是HTML文档的编程接口,它将HTML文档表示为树状结构,其中每个节点都是文档的一部分(如元素、属性或文本)。这种树状结构使我们能够通过编程方式访问和操作HTML元素。

DOM树结构示例:

上面的HTML代码在DOM中的表示形式是一棵树,html元素是根节点,head和body是其子节点,依此类推。每个元素可以有属性(如id、class)、内容和子元素。

1.2 HTML解析的挑战

在爬虫开发中,HTML解析面临以下常见挑战:

  1. 结构多变性:不同网站的HTML结构差异很大,甚至同一网站的不同页面也可能有不同结构
  2. 非标准HTML:实际网页中常见格式错误或不规范的HTML代码
  3. 动态内容:通过JavaScript生成的内容在源代码中不可见
  4. 大量冗余信息:网页中包含大量与目标数据无关的内容
  5. 结构变化:网站更新可能导致HTML结构改变,使原有解析逻辑失效

为了应对这些挑战,我们需要强大而灵活的HTML解析工具。在Go语言中,Goquery库提供了理想的解决方案。

二、Goquery库入门

2.1 Goquery简介

Goquery是Go语言中最流行的HTML解析库,由Martin Angers创建,深受jQuery启发。它提供了类似jQuery的语法和API,使HTML元素选择和操作变得简单直观。

Goquery的主要特点:

  • 熟悉的语法:对熟悉jQuery的开发者友好
  • 强大的选择器:支持几乎所有CSS选择器
  • 链式操作:支持函数链式调用
  • DOM遍历:提供丰富的DOM导航方法
  • 高性能:基于高效的net/html标准库

2.2 安装Goquery

使用Go Modules安装Goquery:

# 初始化模块(如果尚未初始化)
go mod init myproject

# 安装Goquery
go get github.com/PuerkitoBio/goquery

2.3 基本用法示例

下面是一个简单的Goquery使用示例:

package main

import (
	"fmt"
	"log"
	"net/http"
	"strings"

	"github.com/PuerkitoBio/goquery"
)

func main() {
   
   
	// 发起HTTP请求获取网页内容
	res, err := http.Get("https://news.example.com")
	if err != nil {
   
   
		log.Fatal(err)
	}
	defer res.Body.Close()
	if res.StatusCode != 200 {
   
   
		log.Fatalf("状态码错误: %d %s", res.StatusCode, res.Status)
	}

	// 加载HTML文档
	doc, err := goquery.NewDocumentFromReader(res.Body)
	if err != nil {
   
   
		log.Fatal(err)
	}

	// 使用CSS选择器查找元素
	doc.Find("article .title").Each(func(i int, s *goquery.Selection) {
   
   
		// 获取文本内容
		title := s.Text()
		// 去除多余空白
		title = strings.TrimSpace(title)
		fmt.Printf("文章标题 %d: %s\n", i+1, title)

		// 获取链接地址
		href, exists := s.Parent().Attr("href")
		if exists {
   
   
			fmt.Printf("链接地址: %s\n", href)
		}
	})
}

这个例子展示了Goquery的基本工作流程:

  1. 获取HTML内容
  2. 创建Goquery文档对象
  3. 使用选择器查找元素
  4. 处理选中的元素(获取文本、属性等)

2.4 与Colly框架集成

如果您正在使用Colly框架(如上一篇文章所介绍的),可以很容易地集成Goquery:

c := colly.NewCollector()

c.OnHTML("article", func(e *colly.HTMLElement) {
   
   
	// e.DOM是一个goquery.Selection对象
	e.DOM.Find(".title").Each(func(i int, s *goquery.Selection) {
   
   
		title := s.Text()
		fmt.Printf("文章标题: %s\n", title)
	})
})

c.Visit("https://example.com")

在Colly中,HTMLElement结构体包含一个DOM字段,它是一个goquery.Selection对象,提供了对当前元素的所有Goquery功能的访问。

三、CSS选择器详解

3.1 基本选择器

CSS选择器是从HTML文档中选择元素的模式。Goquery支持大多数CSS3选择器。以下是最常用的基本选择器:

选择器 示例 描述
元素选择器 p 选择所有<p>元素
ID选择器 #main 选择id为"main"的元素
类选择器 .title 选择所有class包含"title"的元素
组合选择器 div, p 选择所有<div>元素和所有<p>元素
后代选择器 div p 选择<div>内的所有<p>元素
子元素选择器 div > p 选择<div>的直接子元素<p>
相邻兄弟选择器 h1 + p 选择紧跟在<h1>后的<p>元素
一般兄弟选择器 h1 ~ p 选择<h1>后的所有同级<p>元素

3.2 属性选择器

属性选择器允许根据元素的属性来选择元素:

选择器 示例 描述
[attr] [href] 选择有href属性的元素
[attr=value] [type="text"] 选择type="text"的元素
[attr^=value] [href^="https"] 选择href以"https"开头的元素
[attr$=value] [href$=".pdf"] 选择href以".pdf"结尾的元素
[attr*=value] [href*="example"] 选择href包含"example"的元素

3.3 伪类选择器

Goquery支持部分CSS3伪类选择器:

选择器 示例 描述
:first-child li:first-child 选择作为第一个子元素的每个<li>元素
:last-child li:last-child 选择作为最后一个子元素的每个<li>元素
:nth-child(n) tr:nth-child(2n) 选择作为第2n个子元素的每个<tr>元素(偶数行)
:empty div:empty 选择没有子元素的<div>元素
:not(selector) div:not(.ignore) 选择不包含class="ignore"的所有<div>元素

3.4 选择器组合与优先级

复杂的选择需求通常需要组合多种选择器:

// 选择具有特定class的div中的第一个段落
doc.Find("div.content > p:first-child")
Go语言爬虫:goquery 的详细使用 goquery 是 Go 语言中处理 HTML 的瑞士军刀,它将 jQuery 的语法和便利性带到了 Go 的世界里。 阅读详情

相关推荐

掌握Golang网络爬虫库:构建高效数据采集工具

在数字信息迅速增长的今天,网络爬虫作为一种自动化获取网络信息的程序变得尤为重要。Go语言,作为一种高效、简洁的编程语言,凭借其出色的并发处理能力和强大的标准库支持,已经成为开发网络爬虫的热门选择。Colly是一个专为Go语言设计的高效网络爬虫框架,以其轻量级、模块化设计和强大的选择器系统而闻名。它支持异步的爬取操作,并且集成了请求、调度器、中间件和数据存储等组件。Colly的插件系统允许用户扩展功能,例如用于遵循链接、处理数据或管理请求队列。其基本组件包括:Collector。

weixin_42627459的博客 2475

HTML入门(详细教程),前端入门从这里开始

HTML基础教程,网页框架搭建,表单制作,了解HTML标签的基本用法,每个标签具备哪些属性。

wandertp的博客 1284

安卓-折叠屏平行视界适配(多厂商兼容与优先级实战)

本文详细解析了安卓折叠屏平行视界适配的现状与挑战,重点探讨了多厂商兼容性策略和优先级冲突的实战解决方案。通过对比Google的Embedding方案和国内厂商的EasyGo标准,提供了检测设备支持方案、处理优先级冲突及双方案共存的最佳实践,帮助开发者高效完成折叠屏适配。

weixin_29190169的博客 162

Ubuntu20.04 高效安装企业微信的完整指南

本文提供了在Ubuntu20.04系统上高效安装企业微信的完整指南,详细介绍了通过Deepin-wine环境运行Windows版企业微信的步骤和优化技巧。内容包括系统环境检查、依赖安装、企业微信包的获取与安装、首次运行配置及常见问题解决方案,帮助开发者在Ubuntu系统中流畅使用企业微信进行办公通讯。

weixin_42568801的博客 351

Android Profiler 帧率优化实战与性能调优

本文详细介绍了使用Android Profiler进行帧率优化与性能调优的实战方法。通过分析主线程状态、FPS曲线和渲染阶段耗时,精准定位卡顿根源,并提供减少过度绘制、优化绘制命令及改善资源使用的具体策略。文章结合电商、游戏等真实案例,帮助开发者有效解决卡顿问题,提升应用流畅度。

palm99的专栏 536

【MicroPython编程-ESP32篇:设备驱动】-BNO08X系列传感器驱动

BNO08X 系列(BNO085/BNO086)是一款系统级封装 (SiP),集成了三轴加速度计、三轴陀螺仪、磁力计以及运行 CEVA SH-2 固件的 32 位 ARM® Cortex™-M0+ 微控制器。SH-2 包含 MotionEngine™ 软件,该软件提供复杂的信号处理算法来处理传感器数据,并提供精确的实时 3D 姿态、航向、校准加速度和校准角速度,以及更高级的上下文输出。BNO08X 集成在一个 28 引脚 LGA 封装中,尺寸为 3.8mm x 5.2mm x 1.1mm。它兼容 Andro

视觉与物联智能 695

Android 13 SPRD 源码默认打开多用户实际无效果问题修复

【代码】Android 13 SPRD 源码默认打开多用户实际无效果问题修复。

m0_60898338的博客 449

IDCNBSAIS-财务报表功能范围取值管理费用、销售费用、研发费用排除指定科目的实现

研究了很多方法,没有办法实现,只在营业费用增加一个冲抵项解决,也咨询了外部顾问说要建立自建表。限于需要马上修正后面只能用了最最low的办法处理了一下。公司遇到的一个问题,目前报表有些项目是按照功能范围取值的,发现取多了。IDCNBSAIS-财务报表功能范围取值管理费用、销售费用、研发费用排除指定科目的实现。最后结果是正确的,但是总觉得有更好的办法,不知道有没有高人可以指点一下?建立一个调整项的目录,在每个节点做了调整。除了研发费用做了冲抵在以下每个节点都做了冲抵。为财务报表定义表格结构。

nopicture的博客 1493

以太网GMAC-RK3568

第 2 章和第 3 章中针对 RMII/RGMII 接口芯片和 USB 以太网两种类型芯片在 SDK 上的配置做详细的描述,第 4 章介绍以太网在 Android 上的相关调用接口。第 5 章提供常见问题的排查建议由于在 RK 系列的 SoC 中内置了以太网 MAC 控制器,所以只需要搭配一颗以太网 PHY 芯片,即可实现以太网卡功能按照规范,即使是不同厂家的 PHY,仍然有一部分寄存器的定义是通用的,只要配置了这些通用的寄存器,基本上 PHY 就可以正常工作代码位置在。

qq_24093081的博客 1942

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

上一篇: 【Go语言爬虫系列01】爬虫入门与Colly框架基础
下一篇: 【Go语言爬虫系列03】Colly高级特性与并发控制
Gopher部落
博客等级 码龄2年 784粉丝 92原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gopher部落

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值