GoにおけるBeautiful Soupの代替手段
HTMLからのデータ抽出という話題を続けます。
目次
- GoでBeautiful Soupの直接的なアナログを使用するには、soupを使用してください。
- CSSセレクターのサポートが必要な場合は、goqueryを検討してください。
- XPathクエリには、htmlqueryを使用してください。
- Beautiful Soupから着想を得たもう一つのオプションとして、Nodeを確認してください。
GoでのBeautiful Soup同等のライブラリをお探しの場合は、いくつかのライブラリが類似したHTML解析やスクレイピング機能を提供しています:

soup
- soupは、PythonのBeautiful Soupのアナログとして明確に設計されたGoライブラリです。そのAPIは意図的に類似しており、
Find、FindAll、HTMLParseなどの関数を備えています。そのため、Beautiful Soupに慣れた開発者がGoに移行しやすくなっています。 - Beautiful Soupと同様に、Webページを取得し、HTMLを解析して、DOMを巡回してデータを抽出することができます。
- 使用例:
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は、DOMの巡回と操作に対してjQueryのような構文を提供する、もう一つの人気のGo HTML解析ライブラリです。
- 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 Library
htmlqueryは、XPath式を使用してHTMLドキュメントからの解析とデータ抽出のために設計されたGoライブラリです。HTMLツリー構造の巡回とクエリのために、素朴なAPIを提供し、Webスクレイピングやデータ抽出タスクに特に有用です。
主な特徴
- XPath 1.0/2.0式でHTMLドキュメントのクエリが可能です。
- 文字列、ファイル、またはURLからHTMLを読み込むことをサポートします。
- 単一または複数のノードを見つけ出し、属性を抽出し、XPath式を評価するための関数を提供します。
- XPath式の繰り返しコンパイルを回避してパフォーマンスを向上させるため、クエリキャッシュ(LRUベース)を含んでいます。
- Goの標準HTML解析ライブラリの上に構築されており、goqueryなどの他のGoライブラリと互換性があります。
基本的な使用例
文字列からHTMLを読み込む:
doc, err := htmlquery.Parse(strings.NewReader("..."))
URLからHTMLを読み込む:
doc, err := htmlquery.LoadURL("http://example.com/")
すべての `` 要素を見つける:
list := htmlquery.Find(doc, "//a")
href 属性を持つすべての `` 要素を見つける:
list := htmlquery.Find(doc, "//a[@href]")
最初の `` 要素のテキストを抽出する:
h1 := htmlquery.FindOne(doc, "//h1")
fmt.Println(htmlquery.InnerText(h1)) // Outputs the text inside
`` 要素から href 属性のすべての値を抽出する:
list := htmlquery.Find(doc, "//a/@href")
for _, n := range list {
fmt.Println(htmlquery.SelectAttr(n, "href"))
}
典型的な使用ケース
- CSSセレクターよりもXPathの方がより正確または複雑なクエリを提供するWebスクレイピング。
- HTMLドキュメントからの構造化データの抽出。
- HTMLツリーのプログラマティックなナビゲーションと操作。
インストール
go get github.com/antchfx/htmlquery
Node
- Nodeは、Beautiful Soupから着想を得たGoパッケージであり、HTMLおよびXMLドキュメントからのデータ抽出のためのAPIを提供します。
Colly
Colly - Go向けWebスクレイピングフレームワーク。内部でHTML解析のためにgoqueryを使用します。
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()
// Find and visit all links
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のスタイルとセレクターの機能にあります。