パターン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で変換する方式。
あまりスマートではない・・・が他になかった。
参考まで。
コメント