Go 语言中 Beautiful Soup 的替代方案

继续讨论从 HTML 中提取数据的话题

目录
  • 若要在 Go 中寻找一个与 Beautiful Soup 直接对应的库,请使用 soup
  • 若需要支持 CSS 选择器,请考虑使用 goquery
  • 若需要使用 XPath 查询,请使用 htmlquery
  • 若需要另一个受 Beautiful Soup 启发的选项,请查看 Node

如果您正在寻找 Go 中的 Beautiful Soup 等效库,有多个库提供了类似的 HTML 解析和抓取功能:

gopher 正在煮汤

soup

  • soup 是一个专门为 Go 设计的库,明确作为 Python 的 Beautiful Soup 的类比。其 API 有意与 Beautiful Soup 相似,具有 FindFindAllHTMLParse 等函数,使熟悉 Beautiful Soup 的开发者能够轻松过渡到 Go。
  • 它允许您获取网页、解析 HTML 并遍历 DOM 以提取数据,这与 Beautiful Soup 的方式类似。
  • 使用示例:
    resp, err := soup.Get("https://xkcd.com")
    if err != nil {
        os.Exit(1)
    }
    doc := soup.HTMLParse(resp)
    links := doc.Find("div", "id", "comicLinks").FindAll("a")
    for _, link := range links {
        fmt.Println(link.Text(), "| Link :", link.Attrs()["href"])
    }
    
  • 注意:soup 不支持 CSS 选择器或 XPath;它依赖于基于标签和属性的搜索。

goquery

  • goquery 是另一个用于 HTML 解析的流行 Go 库,提供类似 jQuery 的语法用于 DOM 遍历和操作。
  • 它支持 CSS 选择器,与 soup 相比,对于复杂查询更加灵活。
  • 使用示例:
    doc, err := goquery.NewDocumentFromReader(resp.Body)
    doc.Find("div#comicLinks a").Each(func(i int, s *goquery.Selection) {
        fmt.Println(s.Text(), "| Link :", s.AttrOr("href", ""))
    })
    

htmlquery Go 库

htmlquery 是一个用于通过 XPath 表达式解析和提取 HTML 文档数据的 Go 库。它提供了一个简单直观的 API,用于遍历和查询 HTML 树结构,特别适用于网络爬虫和数据提取任务。

主要功能

  • 允许使用 XPath 1.0/2.0 表达式查询 HTML 文档。
  • 支持从字符串、文件或 URL 加载 HTML。
  • 提供查找单个或多个节点、提取属性和评估 XPath 表达式的功能。
  • 包含查询缓存(基于 LRU)以通过避免重复编译 XPath 表达式来提高性能。
  • 基于 Go 的标准 HTML 解析库构建,并与 goquery 等其他 Go 库兼容。

基本使用示例

从字符串加载 HTML:

doc, err := htmlquery.Parse(strings.NewReader("..."))

从 URL 加载 HTML:

doc, err := htmlquery.LoadURL("http://example.com/")

查找所有 <a> 元素:

list := htmlquery.Find(doc, "//a")

查找所有带有 href 属性的 <a> 元素:

list := htmlquery.Find(doc, "//a[@href]")

提取第一个 <h1> 元素的文本:

h1 := htmlquery.FindOne(doc, "//h1")
fmt.Println(htmlquery.InnerText(h1)) // 输出内部文本

提取所有 <a> 元素的 href 属性值:

list := htmlquery.Find(doc, "//a/@href")
for _, n := range list {
    fmt.Println(htmlquery.SelectAttr(n, "href"))
}

典型使用场景

  • 在 XPath 提供比 CSS 选择器更精确或更复杂的查询时进行网络爬虫。
  • 从 HTML 文档中提取结构化数据。
  • 以编程方式遍历和操作 HTML 树。

安装

go get github.com/antchfx/htmlquery

Node

  • Node 是一个受 Beautiful Soup 启发的 Go 包,提供从 HTML 和 XML 文档中提取数据的 API。

Colly

Colly - 一个用于 Go 的网络爬虫框架,内部使用 goquery 进行 HTML 解析。

https://github.com/gocolly/colly

安装方法 - 将 colly 添加到您的 go.mod 文件中:

module github.com/x/y

go 1.14

require (
        github.com/gocolly/colly/v2 latest
)

示例:

func main() {
	c := colly.NewCollector()

	// 查找并访问所有链接
	c.OnHTML("a[href]", func(e *colly.HTMLElement) {
		e.Request.Visit(e.Attr("href"))
	})

	c.OnRequest(func(r *colly.Request) {
		fmt.Println("Visiting", r.URL)
	})

	c.Visit("http://go-colly.org/")
}

对比表

API 风格 选择器支持 启发来源 备注
soup 类似 Beautiful Soup 标签和属性 Beautiful Soup 简单,无 CSS/XPath
goquery 类似 jQuery CSS 选择器 jQuery 灵活,受欢迎
htmlquery XPath XPath lxml/XPath 高级查询
Node 类似 Beautiful Soup 标签和属性 Beautiful Soup 与 soup 类似

总结

  • 若要在 Go 中寻找一个与 Beautiful Soup 直接对应的库,请使用 soup
  • 若需要支持 CSS 选择器,请考虑使用 goquery
  • 若需要使用 XPath 查询,请使用 htmlquery
  • 若需要另一个受 Beautiful Soup 启发的选项,请查看 Node

所有这些库都利用了 Go 的标准 HTML 解析器,该解析器功能强大且符合 HTML5 规范,因此主要区别在于 API 风格和选择器功能。

有用的链接