Node.jsで、取得したWebページをUTF-8へ自動変換する

f:id:u-jiro:20130503022521p:plain Node.jsでスクレイピングをしようとしたところ、文字コードを判定、変換する必要に迫られました。 そこで取得したWebページの文字コードを自動で識別し、UTF-8へ変換するようにしました。 CoffeeScriptで書いてます。

Requirements

以下の npm パッケージが必要です。

  • iconv
  • buffer
  • request
  • cheerio


文字コードの識別・変換

取得したWebページのmetaタグから文字コードを取得し、IconvでUTF-8へ変換します。 エラー処理などは特に意識していません。

{Iconv}  = require "iconv"
{Buffer} = require "buffer"


# エンコーディングの判別
getCharset = (body) ->
  bin = body.toString('binary')
  re = bin.match(/<meta\b[^>]*charset=([\w\-]+)/i)
  if re
    charset = re[1]
  else
    charset = "utf-8"
  charset


# エンコーディングをUTF-8へ変換
toUtf8 = (body) ->
  iconv = new Iconv(getCharset(body), 'UTF-8//TRANSLIT//IGNORE')
  body = new Buffer(body, 'binary')
  body = iconv.convert(body).toString()


module.exports =
  toUtf8: toUtf8


いざスクレイピング

上記のコードをcharset.coffeeとして保存します。 requestで取得したWebページをcharset.toUtf8へ渡すと、UTF-8へ変換します あとはcheerioで好きにスクレイピングができます。

request = require "request"
cheerio = require "cheerio"
charset = require "charset"


# 指定URLを処理する
processPage = (url) ->
  request
    uri: url
    encoding: "binary"
  , scrapingPage


# 取得したページをスクレイピングする
scrapingPage = (error, response, body) ->
  if not error and response.statusCode is 200
    # UTF-8へ変換
    $ = cheerio.load(charset.toUtf8(body))

    #
    # 好きなスクレイピング ...
    #


# 実行
processPage('http://www.jma.go.jp/jma/index.html')


スクレイピングは夢が広がりますね :)