Go用のBeautiful Soupの代替ソフトウェア
HTMLからデータを抽出する話題を続ける
目次
- PythonのBeautiful Soupに直接対応したGoのライブラリとして、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と同様に、ウェブページを取得し、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は、HTML解析に使用されるもう一つの人気のあるGoライブラリで、DOMのトラバースおよび操作にjQueryのような構文を提供します。
- 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ライブラリです。HTMLツリー構造をトラバースおよびクエリするための直感的なAPIを提供しており、特にウェブスクレイピングおよびデータ抽出タスクに非常に役立ちます。
主な特徴
- 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)) // 内部のテキストを出力
すべての``要素のhref
属性の値を抽出:
list := htmlquery.Find(doc, "//a/@href")
for _, n := range list {
fmt.Println(htmlquery.SelectAttr(n, "href"))
}
典型的な使用ケース
- CSSセレクタよりもXPathがより正確または複雑なクエリを提供するウェブスクレイピング。
- 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
インストール方法 - go.mod
ファイルにcollyを追加してください:
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と類似 |
まとめ
- PythonのBeautiful Soupに直接対応したGoのライブラリとして、soupを使用してください。
- CSSセレクタをサポートする場合は、goqueryを検討してください。
- XPathクエリを使用する場合は、htmlqueryを使用してください。
- また、Beautiful Soupにインスパイアされた別のオプションとして、Nodeを確認してください。
これらのライブラリはすべて、Goの標準HTMLパーサーを使用しており、これは堅牢でHTML5準拠であるため、主な違いはAPIスタイルとセレクタの能力にあります。