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