ノードと爬虫類の前に行っているときに遭遇する中国のゴミ問題は、今日のノートをダウン終え、解決されていません。(PS:一部のオンラインソリューションは死ななければなら)
中国の歪みは、特にノードで符号化GBKページ要求を指し、ウェブページは、「中国語のページ」正しい「GBK」との2つの条件が不可欠である(必要にトランスコードする)中国語で取得することができません。中国のUTF-8エンコードされたWebページを取得することができ、あなたはまた、Webページや他のデジタル英語をコーディングGBK得ることができます。
ここでは簡単な例です。取得 http://acm.hdu.edu.cn/statistic.php?pid=1000 のためのナンバーワンの回答のユーザ名、「オーロラヒョン影。」ブラシブラシは、次のコードを記述します。
var cheerio = require('cheerio')
, superagent = require('superagent') , express = require('express'); var url = 'http://acm.hdu.edu.cn/statistic.php?pid=1000'; var app = express(); app.get('/', function (req, res, next) { superagent.get(url) .end(function (err, sres) { var html = sres.text; var $ = cheerio.load(html, {decodeEntities: false}); var ans = $('.table_text td a').eq(0).html(); res.send(ans); }); }); app.listen(3000, function () { console.log('app is listening at port 3000'); });
次のように私たちは、文字化けしてしまいました:
������Ӱ
右の中国のDOを取得する方法?ここでは(単に緊急時のために、原則として気にしないでください)、いくつかのソリューション緊急です。
この方法の一つ:
使用し たSuperAgent-文字セット のモジュール。
var cheerio = require('cheerio')
, superagent = require('superagent-charset') , express = require('express'); var url = 'http://acm.hdu.edu.cn/statistic.php?pid=1000'; var app = express(); app.get('/', function (req, res, next) { superagent.get(url) .charset('gbk') .end(function (err, sres) { var html = sres.text; var $ = cheerio.load(html, {decodeEntities: false}); var ans = $('.table_text td a').eq(0).html(); res.send(ans); }); }); app.listen(3000, function () { console.log('app is listening at port 3000'); });
非常に使いやすい、のみを導入する必要がある superagent-charset
モジュールを、およびコールチェーンのcharsetパラメータに追加することができます。たSuperAgent-文字セット・モジュールは、モジュールとiconv-LITEたSuperAgentモジュールを含みます。ソースコードが参照できる のGithub 。
方法2:
直接 iconvが-liteの トランスコーディングモジュール。
iconv-Liteは (ノードデフォルトエンコーディングUTF-8)をトランスコードモジュール行います。コードをデコードする必要があることが必要 バッファ タイプ。
-
http
モジュール:http.get(url, function(sres) { var chunks = []; sres.on('data', function(chunk) { chunks.push(chunk); }); sres.on('end', function() { // 将二进制数据解码成 gb2312 编码数据 var html = iconv.decode(Buffer.concat(chunks), 'gb2312'); var $ = cheerio.load(html, {decodeEntities: false}); var ans = $('.table_text td a').eq(0).html(); res.send(ans); }); });
-
要求 モジュール:
request({ url: url, encoding: null // 关键代码 }, function (err, sres, body) { var html = iconv.decode(body, 'gb2312') var $ = cheerio.load(html, {decodeEntities: false}); var ans = $('.table_text td a').eq(0).html(); res.send(ans); });
デコードパラメータはiconvのバッファで渡さなければなりません。
encoding
-のsetEncodingに使用されるエンコードresponse
データ。場合はnull
、body
Aとして返されますBuffer
。(他の何か のデフォルト値を含むがundefined
)への符号化パラメータとして渡されますtoString()
(これが効果的である意味utf8
デフォルト)。( 注 :あなたがバイナリデータを期待する場合は、設定する必要がありますencoding: null
。)
iconv-LITEモジュールは、HTTP要求モジュール及びモジュールを協働することができ、モジュールが直接たSuperAgent使用することはできません。たSuperAgentは、データを取得するためにUTF8であるため、その後のiconvターンを使用することは認められません。GBKページがエンコードされ、sres.textはすでにそれがUTF8に変換され、結果が不正確である必要がありますアウト・バッファに変換されたことが、結果をデコードしていました。