GoにおけるBeautiful Soupの代替手段

HTMLからのデータ抽出という話題を続けます。

目次
  • GoでBeautiful Soupの直接的なアナログを使用するには、soupを使用してください。
  • CSSセレクターのサポートが必要な場合は、goqueryを検討してください。
  • XPathクエリには、htmlqueryを使用してください。
  • Beautiful Soupから着想を得たもう一つのオプションとして、Nodeを確認してください。

GoでのBeautiful Soup同等のライブラリをお探しの場合は、いくつかのライブラリが類似したHTML解析やスクレイピング機能を提供しています:

gopher is cooking soup

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のスタイルとセレクターの機能にあります。

有用なリンク

購読する

システム、インフラ、AIエンジニアリングの新記事をお届けします。