2012-09-07 25 views
12

मैं this page को this request library के साथ नोड.जेएस में ला रहा हूं, और cheerio का उपयोग करके शरीर को पार्स कर रहा हूं।नोड.जेएस स्क्रैप एन्कोडिंग?

पार्स प्रतिक्रिया शरीर पर $.html() कॉलिंग पता चलता है कि पेज के लिए शीर्षक विशेषता है: ...

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

जब यह होना चाहिए:

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

मैं सेटिंग विकल्पों की कोशिश की है अनुरोध पुस्तकालय के लिए encoding: 'utf8' शामिल करने के लिए, लेकिन ऐसा कुछ भी नहीं दिख रहा था।

मैं इन पात्रों को कैसे संरक्षित करूं?

+0

बंदगी भी सिर्फ प्रदर्शन हो सकता है [इस बग] (https://github.com/cheeriojs/cheerio/issues/548), गलत तरीके से कुछ वर्णों आउटपुट जो कुछ स्थितियों में –

उत्तर

18

पृष्ठ आईएसओ -885 9 -1 के साथ एन्कोड किया गया प्रतीत होता है। आपको request को encoding: 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

यह सही उत्तर होना चाहिए। यह एन्कोडिंग का पता लगाने के लिए चालाकी से सभी उपलब्ध साधनों (साइट के डेवलपर से पूछने के अलावा) का उपयोग करता है और यह सफल होता है! –

संबंधित मुद्दे