21
22

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2013-05-18

追記
ajido@githubさんにコメント頂き、HTML5のケースに対応して修正しました。ありがとうございます!

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

Requirements

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

  • iconv
  • buffer
  • request
  • cheerio

文字コードの識別・変換

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

charset.coffee
{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')

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

21
22
4

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
21
22

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?