Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

追記
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')

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away