Go 语言中 Beautiful Soup 的替代方案
继续讨论从 HTML 中提取数据的话题
目录
- 若要在 Go 中寻找一个与 Beautiful Soup 直接对应的库,请使用 soup。
- 若需要支持 CSS 选择器,请考虑使用 goquery。
- 若需要使用 XPath 查询,请使用 htmlquery。
- 若需要另一个受 Beautiful Soup 启发的选项,请查看 Node。
如果您正在寻找 Go 中的 Beautiful Soup 等效库,有多个库提供了类似的 HTML 解析和抓取功能:
soup
- soup 是一个专门为 Go 设计的库,明确作为 Python 的 Beautiful Soup 的类比。其 API 有意与 Beautiful Soup 相似,具有
Find
、FindAll
和HTMLParse
等函数,使熟悉 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 风格和选择器功能。