网站首页 > 技术文章 正文
习惯了使用 jQuery 的 $(...) 语法来查询和操作 DOM 元素,那换种语言,用 Go 语言该怎么实现呢?来看看 goquery 吧!
简介
goquery,是 github 上 PuerkitoBio 开源的 Go 语言库,代码仓库在
https://github.com/PuerkitoBio/goquery。goquery 是一个用于查询和操作 DOM 元素的库,并采用了尽可能与 jQuery 相似的语法,以降低学习难度和使用门槛。
安装
goquery 需要 Go 1.1 以上版本,使用 go get 直接安装:
go get github.com/PuerkitoBio/goquery
目前的版本为 v1.5.1,依赖包括 net/html 和 CSS 选择器 cascadia。
示例
goquery 主要使用了两个结构体 Document (文档) 和 Selection (选择)。Document 代表了一个解析之后的 HTML 文档,而 Selection 则代表了进行查询后得到的 DOM 结点集合。Document 的定义中嵌入了 Selection,故而 Document 可使用 Selection 的方法。
下面给出一个 goquery 的使用例子:
package main
import (
"fmt"
"log"
"net/http"
"github.com/PuerkitoBio/goquery"
)
func ExampleScrape() {
// 请求HTML页面.
res, err := http.Get("http://metalsucks.net")
if err != nil {
log.Fatal(err)
}
defer res.Body.Close()
if res.StatusCode != 200 {
log.Fatalf("status code error: %d %s", res.StatusCode, res.Status)
}
// 解析HTML生成goquery文档.
doc, err := goquery.NewDocumentFromReader(res.Body)
if err != nil {
log.Fatal(err)
}
// 在文档中进行查找.
doc.Find(".sidebar-reviews article .content-block").Each(func(i int, s *goquery.Selection) {
// 对于查找到的每一项,进一步获取目标文本内容.
band := s.Find("a").Text()
title := s.Find("i").Text()
fmt.Printf("Review %d: %s - %s\n", i, band, title)
})
}
func main() {
ExampleScrape()
}
该例子对一个新闻类网站进行了解析,并获取每一条新闻的标题等文本信息。
我们首先使用 net/http 进行 HTTP 请求,得到目标网站的响应。然后,使用了goquery 的 NewDocumentFromReader 来从响应读取并解析得到一个 HTML 文档。NewDocumentFromReader 是这样定义的:
func NewDocumentFromReader(r io.Reader) (*Document, error)
然后,使用 Selection 的 Find 方法进行查找,返回查询结果,对应 jQuery 中的 find 函数:
func (s *Selection) Find(selector string) *Selection
对于结果集合,使用 Selection 的 Each 方法进行遍历,对应 jQuery 中的 each 函数:
func (s *Selection) Each(f func(int, *Selection)) *Selection
对于遍历的每一项,再次使用 Find 查找子元素,并利用 Text 方法获得元素的文本,对应 jQuery 的 text 函数:
func (s *Selection) Text() string
总结
goquery 使用 Go 语言实现了与 jQuery 尽可能相似的查询和操作语法,包括 CSS 选择语法和绝大部分的操作函数,方便熟悉 jQuery 的 Go 语言开发人员快速完成 HTML 文档的解析和查询操作。
goquery库方便了 Go 语言进行网页抓取和解析的工作,使得Go语言在该领域有了门槛较低、使用方便的工具。
goquery库目前已经历了数年的开发,代码质量较高,注释丰富,值得研究学习。
猜你喜欢
- 2025-03-28 前端工程师养成计划 专区(前端工程师进阶)
- 2025-03-28 建站的技术篇(干货分享)(建站是干什么的)
- 2025-03-28 js获取链接内容(抓取html资源链接)
- 2025-03-28 Web前端新人笔记之了解Jquery(jquery 前端)
- 2025-03-28 web前端Jquery学习笔记一(jquery 前端)
- 2025-03-28 用了 7 年 Web 组件,踩坑无数,我终于看清了的真相
- 2025-03-28 程序猿看小说还要去找TXT?自己动手爬一个TXT才是正确的打开方式
- 2025-03-28 关于JQuery引用及基本用法(jquery的引用)
- 2025-03-28 vue中监听滚动事件:方法简单留着备用
- 2025-03-28 JavaScript学习笔记(三十二)—jQuery(中)
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)