YAMAGUCHI::weblog

土足で窓から失礼いたします。今日からあなたの息子になります。 当年とって92歳、下町の発明王、エジソンです。

XPath使うならxmlpathパッケージ

はじめに

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

xmlpathパッケージ

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

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

使い方

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

resp, err := http.Get("http://sample.com/content")
if err != nil {
    return nil
}
defer resp.Body.Close()

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

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属性を全部取得できます。便利。