Go语言HTML解析:库概览与代码示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Go (Golang) 中的 HTML 解析:库概览与实用示例



Go (Golang) 是一种编译型、静态类型语言,非常适合构建高性能的网页抓取和 HTML 解析工具。内置的标准库 net/html 提供了底层分词器,但为了方便操作 DOM 树和使用 CSS 选择器,通常使用第三方包。在本文中,我们将介绍三种关键工具:goquery、colly 和 标准包 net/html。您将了解如何选择合适的工具,并看到可运行的代码示例。



1. 标准库:net/html



golang.org/x/net/html 包提供了 HTML 分词器和解析器。它实现了 HTML5 规范,可以将文档解析为节点树。这是最轻量、最快的选择,但需要编写更多代码来进行导航。



示例:从页面中提取所有链接 (<a href>):



package main

import ( "fmt" "golang.org/x/net/html" "net/http" "strings")

func main() { resp, _ := http.Get("https://example.com") defer resp.Body.Close()

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

var links []string var f func(*html.Node) f = func(n *html.Node) { if n.Type == html.ElementNode && n.Data == "a" { for _, attr := range n.Attr { if attr.Key == "href" { links = append(links, attr.Val) } } } for c := n.FirstChild; c != nil; c = c.NextSibling { f(c) } } f(doc)

fmt.Println(strings.Join(links, ""))}


优点:依赖最少,速度快。
缺点:没有 CSS 选择器,需要编写递归遍历器。



2. goquery —— Go 语言的 jQuery



goquery 是 Go 语言中最流行的 HTML 解析库。它在底层使用 net/html,并添加了类似 jQuery 的语法。您可以使用 CSS 选择器查找元素、链式调用以及操作 DOM。



安装:

go get github.com/PuerkitoBio/goquery


示例:从博客中收集文章标题:



package main

import ( "fmt" "github.com/PuerkitoBio/goquery" "log" "net/http")

func main() { resp, err := http.Get("https://habr.com/ru/all/") if err != nil { log.Fatal(err) } defer resp.Body.Close()

doc, err := goquery.NewDocumentFromReader(resp.Body) if err != nil { log.Fatal(err) }

doc.Find("article h2").Each(func(i int, s *goquery.Selection) { title := s.Text() link, _ := s.Find("a").Attr("href") fmt.Printf("%d. %s %s", i+1, title, link) })}


goquery 主要方法:

  • Find(selector) —— 根据 CSS 选择器查找元素
  • Each(func) —— 遍历找到的元素
  • Attr(name) —— 获取属性值
  • Text() —— 提取文本内容
  • Html() —— 获取元素内部的 HTML 代码


goquery 非常适合快速原型开发以及解析结构复杂的页面。但请注意:它不支持执行 JavaScript —— 这是一个用于静态 HTML 的工具。



3. Colly —— 网页抓取框架



Colly 是一个强大的框架,不仅包含 HTML 解析(通过 goquery),还管理请求队列、处理 Cookie、限制并发等。

推荐