LoginSignup
11
10

More than 5 years have passed since last update.

golangでUTF8以外で書かれたページを読み込む ※iconvは使わない

Posted at

たとえばgoでSJISで書かれたページをスクレイピングしたいとき

goqueryでUTF8以外の文字コードで書かれたページを読み込む方法は、goqueryのwikiでも紹介されています。

ここで紹介されているのはiconv-goを使った方法ですが、別解として、transformencoding/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.

djimenez/iconv-go

大抵の環境なら使えると思うけど、万が一、使えない環境に遭遇したときのリスクヘッジとして。

最後に

goをはじめてまだ2日目なので、いろいろとツッコミどころもあると思います。お気づきの点がございましたら、コメントを残していただけると嬉しいです。

11
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
10