Go用のBeautiful Soupの代替ソフトウェア

HTMLからデータを抽出する話題を続ける

目次
  • PythonのBeautiful Soupに直接対応したGoのライブラリとして、soupを使用してください。
  • CSSセレクタをサポートする場合は、goqueryを検討してください。
  • XPathクエリを使用する場合は、htmlqueryを使用してください。
  • また、Beautiful Soupにインスパイアされた別のオプションとして、Nodeを確認してください。

GoにおけるBeautiful Soupに相当するライブラリを探している場合、いくつかのライブラリが類似したHTMLの解析およびスクレイピング機能を提供しています:

gopher is cooking soup

soup

  • soupは、PythonのBeautiful Soupに直接対応したGoのライブラリとして設計されています。APIは意図的に類似しており、FindFindAllHTMLParseなどの関数を備えており、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スタイルとセレクタの能力にあります。

有用なリンク