goqueryでHTMLをパースする

HTMLのパースをするならgoquery!goquery便利すぎて泣いた。 jQueryっぽく使えて良いです。

まずはgoqueryを入れましょう。

% go get github.com/PuerkitoBio/goquery

HTMLをパースする

それではパースしてみましょう。 HTMLのパースのやり方はいくつかあります。

URLから直接パースする

doc, _ := goquery.NewDocument("http://yahoo.co.jp")

文字列をパースする

html := `<h1 class="heading">見出し</h1>`
r := strings.NewReader(html)
doc, _ := goquery.NewDocumentFromReader(r)

パースしたHTMLから要素を取り出す

goqueryでパースしたHTMLから要素を取り出してみましょう

doc.Find(".heading").Text()  //=> 見出し

こんな感じでとっても簡単です。

goqueryのひと通りの操作のテストを書く

goqueryのテストをざっくり書いてみるとこうなります。

package main

import (
    "github.com/PuerkitoBio/goquery"
    "strings"
    "testing"
)

func TestParseHtml(t *testing.T) {
    html := `
<section>
<h1 class="heading">うんこっこ</h1>
<p class="lead">なんかにおうってばよ</p>
</section>
`
    r := strings.NewReader(html)
    doc, _ := goquery.NewDocumentFromReader(r)

    docHeading := doc.Find(".heading").Text()
    heading := "うんこっこ"

    if docHeading != heading {
        t.Errorf("got %v want %v", docHeading, heading)
    }

    docLead := doc.Find(".lead").Text()
    lead := "なんかにおうってばよ"

    if docLead != lead {
        t.Errorf("got %v want %v", docLead, lead)
    }
}

goのテスト実行コマンドで実行してみましょう。

% go test -v
=== RUN TestParseHtml
--- PASS: TestParseHtml (0.00s)
PASS
ok

こんな感じで動けばテスト完了です。 今回のテストコードはGitHubにもあげました。

テスト、だいじだよ、テスト。