2012-09-07 10 views
12

Node.JSでthis request libraryを使用してthis pageをフェッチし、cheerioを使用して本文を解析しています。Node.JSはエンコーディングをスクレイプしますか?

<title>Le Relais de l'Entrec?te</title> 

...それがあるべきとき::私はオプションを設定しようとしました

<title>Le Relais de l'Entrecôte</title> 

解析されたレスポンスボディに$.html()を呼び出す

は、ページのタイトル属性があることが明らかになりましたリクエストライブラリにencoding: 'utf8'が含まれていますが、それは何も変更されていないようです。

どのようにこれらの文字を保存しますか?

+0

チェリオまた、単に間違って特定の文字を出力する、[このバグ](https://github.com/cheeriojs/cheerio/issues/548)を示す可能性がありますある状況では –

答えて

18

ページがiso-8859-1でエンコードされているようです。 requestencoding: nullを渡して符号化されていないバッファを返すように指示し、node-iconvなどを使用して変換します。あなたは一般的なクローラを書いている場合、あなたはそれ以外の場合は、次のあなたのケースのために働く必要があり、あなたはそれを正しく復号化するために発生した各ページのエンコーディングを検出する方法を理解する必要があります

var request = require('request');            
var iconv = require('iconv');             

request.get({                 
    url: 'http://www.relaisentrecote.fr',           
    encoding: null,                
}, function(err, res, body) {             
    var ic = new iconv.Iconv('iso-8859-1', 'utf-8');        
    var buf = ic.convert(body);             
    var utf8String = buf.toString('utf-8'); 
    // .. do something with utf8String ..                    
});                    
24

iconv(またはそれ以上の場合はiconv-lite)を変換自体に使用できますが、charsetおよびjschardetモジュールをチェックアウトする必要があります。ここでは、両方のアクションでそれらの例です:

var charset = require('charset'), 
    jschardet = require('jschardet'), 
    Iconv = require('iconv').Iconv; 

request.get({url: 'http://www.example.com', encoding: 'binary'}, function(err, res, body) { 
    var enc = charset(res.headers, body) || jschardet.detect(body).encoding.toLowerCase(); 

    if(enc !== 'utf8') { 
     var iconv = new Iconv(enc, 'UTF-8//TRANSLIT//IGNORE'); 
     body = iconv.convert(new Buffer(body, 'binary')).toString('utf8'); 
    } 

    console.log(body); 
}); 

+2

私はこれがより良い答えだと考えています。 – leesei

+1

はいこれは間違いなく良い答えであり、受け入れられるものでなければなりません – Malharhak

+1

これは正解でなければなりません。それは賢明にすべての利用可能な手段(サイトの開発者に依頼することを除いて)を使用してエンコードを検出し、成功する! –

関連する問題