ノード爬虫類のウェブサイトGBK中国の歪みソリューション[ターン]を

ノードと爬虫類の前に行っているときに遭遇する中国のゴミ問題は、今日のノートをダウン終え、解決されていません。(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に変換され、結果が不正確である必要がありますアウト・バッファに変換されたことが、結果をデコードしていました。

おすすめ

転載: www.cnblogs.com/chris-oil/p/12602039.html