YAMAGUCHI::weblog

海水パンツとゴーグルで、巨万の富を築きました。カリブの怪物、フリーアルバイター瞳です。

XPath使うならxmlpathパッケージ

はじめに

こんにちは、Go界の大杉漣です。いま、辻堂で合宿をしています。

xmlpathパッケージ

GoでHTMLをパースしてごにょごにょしたいというときはgoqueryを使うことが多いですが、個人的にはあのコールバック書きまくるスタイルが好きではなく「そこまでjQueryの真似しなくてもいいだろ」と思っていました。

またPythonで割とlxmlを使っていたこともあって、XPathを使うのが好きだったのでGoにも同様のXPathを扱えるパッケージがないかと探してみたらCanonical製のxmlpathというパッケージがありました。

使い方

めちゃくちゃ楽。ドキュメントにあるサンプルだとちょっと実用性がないので、もう少し実用性のある例。

resp, _ := http.Get("http://sample.com/content")
defer resp.Body.Close()

path := xmlpath.MustCompile(`//a[@rel='bookmark']/@href`)
root, _ := xmlpath.ParseHTML(resp.Body) // HTML扱うならParse()ではなくParseHTML()

iter := path.Iter(root)
var links []string
for iter.Next() { // イテレータ回せ
    n := iter.Node()
    links = append(links, n.String())
}
return links

これで sample.com/content のページ内にあるaタグで、rel属性が "bookmark" となっているもののhref属性を全部取得できます。便利。