node.jsで文字コードを自動判定してHTMLを取得する

パターン1 sync-requestを使う

自動判定はできない。
文字コード指定は容易。

var syncrequest = require('sync-request');
function get_html(url){
  var response = syncrequest('GET', url);
  return response.getBody('utf8');
}

パターン2 node-fetchを使う

自動判定はできない。
文字コード変換を行えばできる。

パターン3 axios

自動判定はできない。
文字コード変換を行えばできる。

axiosでShift-JISのページを取得する - teamlab-frontend
問題 axiosはutf-8以外に対応してないのでshift-JISのページを取得しても文字化けをする 対応 npmモジュールiconvを使って取得したdataを変換する code:js axios.get( 'url', { responseType: 'arraybuffer', transformResponse...

パターン3 requestを使う

自動判定はできない。
文字コード変換を行えばできる。

var request = require('request');
function get_html(url) {
    return new Promise(function (resolve, reject) {
        var options = {
            url: url,
            followAllRedirects: true,
            headers: {
                'User-Agent': 'MyAgent/1.0.0 (contact@example.com)'
            },
            jar: true,
            encoding: null
        };
        request.get(options, function (error, response, body) {
            if (error) {
                console.log("error", error)
                reject(error);
            }
            
            if (response.statusCode == 200) {
                var tmp_body = body.toString()

                //文字コードの変換
                //HTMLのcharsetを確認する
                let detect_charset = "UTF-8"
                if (tmp_body.match(/charset=[\"]{0,1}EUC-JP/ig))     //i: 大文字小文字を区別しない
                    detect_charset = "EUC-JP"
                else if (tmp_body.match(/charset=[\"]{0,1}(Shift_JIS|sjis)/ig))
                    detect_charset = "SHIFT_JIS"
                else if (tmp_body.match(/charset=[\"]{0,1}ISO-2002-JP/ig))
                    detect_charset = "ISO-2002-JP"
                else if (tmp_body.match(/charset=[\"]{0,1}(UTF-8|utf8)/ig))
                    detect_charset = "UTF-8"
                else {
                    //jschardetは判定に失敗しやすいため、認識できなかった場合にのみ使用する
                    try {
                        var jschardet = require('jschardet');
                        var detectResult = jschardet.detect(html);
                        
                        detect_charset = detectResult.encoding
                    } catch {
                        detect_charset = "UTF-8"
                    }
                }
                
                const Iconv = require('iconv').Iconv;
                const iconv = new Iconv(detect_charset, 'UTF-8//TRANSLIT//IGNORE');
                var html = iconv.convert(body).toString();
                resolve(html)
            } else {
                reject("nazo")
            }
        });
    })
}

HTMLの文字コード指定を取得してiconvで変換する方式。
あまりスマートではない・・・が他になかった。

参考まで。

コメント

タイトルとURLをコピーしました