今までHTMLの解析はRuby使ってNokogiriでやることが多かったんだけど、インストールしようとすると大抵ビルド系のエラーが少なくとも一度は出て、ワーってなることまちがいなし。
というわけで、そういう苦しみの少なそうなgoでのHTML解析を探してみたらgoqueryが良さそうだったのでメモ。
まずはインストール。
$ go get github.com/PuerkitoBio/goquery
続いて、スクリプト。今回書いたのはローカルのファイルを読み込んで、特定のタグのリンク先をまとめて書き換えて標準出力するというもの。
GoDocはこちらなので細かいところはそっちを参照。
package main
import (
"fmt"
"log"
"os"
"github.com/PuerkitoBio/goquery"
)
func ReplaceLinks() {
// ファイルからドキュメントを作成
f, e := os.Open("./index.html")
if e != nil {
log.Fatal(e)
}
defer f.Close()
doc, e := goquery.NewDocumentFromReader(f)
if e != nil {
log.Fatal(e)
}
// DOMを解析してhrefの値を変更
doc.Find(".list td a").Each(func(i int, s *goquery.Selection) {
s.SetAttr("href", fmt.Sprintf("%03d.html", i+1))
})
// 変更したDOMの値をHTMLとして標準出力
result, e := doc.Html()
if e != nil {
log.Fatal(e)
}
fmt.Print(result)
}
func main() {
ReplaceLinks()
}
標準のgoのパーサーよりもこっちのが普段使いには良さそうかな。ちなみにMechanizeっぽいライブラリとしてはsurfが良さそうなので、必要になったら今度使って見る。
これで、Nokogiriのビルド地獄から開放されるといいなー。