Go(Golang)中的HTML解析:库与代码示例

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

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

开始课程

Go(Golang)中的HTML解析:工具概览与示例



Go(Golang)是谷歌开发的一种编译型、静态类型编程语言,非常适合构建高性能解析器和网页抓取工具。凭借内置的并发支持(goroutine)和丰富的标准库,Go能够高效处理任意复杂度的HTML文档。本文将介绍Go中用于HTML解析的主要库、它们的功能,并提供实用的代码示例。



标准库:net/html



golang.org/x/net/html 包是Go中处理HTML的基础。它提供了分词器和解析器,能够构建文档的DOM树。这是一个底层工具,能让你完全控制解析过程,但对于常见任务需要编写更多代码。



使用 net/html 从HTML文档中提取所有链接的示例:



package main

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

func main() { htmlContent := `<html><body><a href="/page1">链接 1</a><a href="/page2">链接 2</a></body></html>` doc, _ := html.Parse(strings.NewReader(htmlContent)) 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) for _, link := range links { fmt.Println(link) }}


这段代码递归遍历DOM树,找到所有 <a> 标签并提取 href 属性的值。这种方法简单可靠,但对于更复杂的任务(例如按CSS选择器查找),最好使用专门的库。



goquery 库:Go语言的jQuery



github.com/PuerkitoBio/goquery 是Go中最流行的HTML解析库。它提供了类似jQuery的API:通过CSS选择器选取元素、方法链、DOM操作。这使得代码简洁且可读性强。



安装:

go get github.com/PuerkitoBio/goquery


解析页面并提取标题和链接的示例:



package main

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

"github.com/PuerkitoBio/goquery")

func main() { // 加载HTML页面 res, err := http.Get("https://example.com") if err != nil { log.Fatal(err) } defer res.Body.Close()

// 解析HTML doc, err := goquery.NewDocumentFromReader(res.Body) if err != nil { log.Fatal(err) }

// 提取h2标题 doc.Find("h2").Each(func(i int, s *goquery.Selection) { fmt.Printf("标题 %d: %s", i+1, s.Text()) })

// 提取所有链接 doc.Find("a").Each(func(i int, s *goquery.Selection) { link, _ := s.Attr("href") text := s.Text() fmt.Printf("链接 %d: %s (%s)", i+1, text, link) })}


goquery 的主要功能:

  • CSS选择器:支持所有标准选择器(类、ID、属性、伪类)。
  • 方法链:Find().Filter().Each() —— 代码风格类似jQuery。
  • 数据提取:Text()、Html()、Attr() 方法。
  • DOM修改:SetText()、SetHtml()、Append()。


对于处理大量数据,goquer

推荐