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

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

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

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

gopher がスープを作っている

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 は、DOM のトラバースおよび操作に jQuery に似た構文を提供するもう一つの人気のある Go ライブラリです。
  • 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"))
}

典型的な使用ケース

  • 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

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

有用なリンク