たとえばgoでSJISで書かれたページをスクレイピングしたいとき
goqueryでUTF8以外の文字コードで書かれたページを読み込む方法は、goqueryのwikiでも紹介されています。
ここで紹介されているのはiconv-goを使った方法ですが、別解として、transformとencoding/japaneseを使う方法を書きます。
iconv-goを使う(引用)
// Load the URL
res, err := http.Get(url)
if err != nil {
// handle error
}
defer res.Body.Close()
// Convert the designated charset HTML to utf-8 encoded HTML.
// `charset` being one of the charsets known by the iconv package.
utfBody, err := iconv.NewReader(res.Body, charset, "utf-8")
if err != nil {
// handler error
}
// use utfBody using goquery
doc, err := goquery.NewDocumentFromReader(utfBody)
if err != nil {
// handler error
}
// use doc...
Tips and tricks · PuerkitoBio/goquery Wiki
iconvを使わない
たとえばSJISのページを読み込む場合。
// Load the URL
res, err := http.Get(url)
if err != nil {
// handle error
}
defer res.Body.Close()
// Convert the designated charset HTML to utf-8 encoded HTML.
utfBody := transform.NewReader(bufio.NewReader(res.Body), japanese.ShiftJIS.NewDecoder())
// use utfBody using goquery
doc, err := goquery.NewDocumentFromReader(utfBody)
if err != nil {
// handler error
}
// use doc...
なんでこんなことを?
iconv-goを使うためには、cgoが必要で、libiconvやglibcも必要。
PLEASE NOTE that this package requires the use of cgo, since it is only a wrapper around iconv - either provided by libiconv or glibc on your system. Attempts to build without cgo enabled will fail.
大抵の環境なら使えると思うけど、万が一、使えない環境に遭遇したときのリスクヘッジとして。
最後に
goをはじめてまだ2日目なので、いろいろとツッコミどころもあると思います。お気づきの点がございましたら、コメントを残していただけると嬉しいです。