优秀的编程知识分享平台

网站首页 > 技术文章 正文

GoQuery - Go语言的jQuery(go语言 方法)

nanyue 2025-03-28 19:24:49 技术文章 2 ℃

习惯了使用 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库目前已经历了数年的开发,代码质量较高,注释丰富,值得研究学习。

最近发表
标签列表