はじめに
こんにちは、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属性を全部取得できます。便利。