سيكون لدى Node.js مشاكل في الكود المشوهة عند زحف صفحات الويب الصينية التي ليست UTF-8. على سبيل المثال ، يكون ترميز الصفحة الرئيسية لـ Netease هو GB2312 ، وسيكون للرموز المشوهة رموز مشوهة عند الزحف.
نسخة الكود كما يلي:
طلب var = طلب ('طلب')
var url = 'http://www.163.com'
طلب (url ، وظيفة (err ، الدقة ، الجسم) {
console.log (الجسم)
})
يمكنك استخدام iconv-lite لحلها
ثَبَّتَ
نسخة الكود كما يلي:
NPM تثبيت iconv-lite
في الوقت نفسه ، سنقوم بتعديل وكيل المستخدم لمنع موقع الويب من الحظر:
نسخة الكود كما يلي:
var OriginRequest = require ('request')
var iconv = require ('iconv-lite')
رؤوس var = {
"عامل المستخدم": "Mozilla/5.0 (Macintosh ؛ Intel Mac OS X 10_10_1) AppleWebkit/537.36 (KHTML ، مثل Gecko) Chrome/39.0.2171.65 Safari/537.36"
}
طلب الوظيفة (URL ، رد الاتصال) {
خيارات var = {
عنوان URL: URL ،
الترميز: لاغية ،
الرؤوس: الرؤوس
}
OriginRequest (الخيارات ، رد الاتصال)
}
طلب (url ، وظيفة (err ، الدقة ، الجسم) {
var html = iconv.decode (الجسم ، 'GB2312')
console.log (HTML)
})
حل المشكلة المشوهة
استخدم Cheatio لتحليل HTML
يمكن أن يكون Cheerio ببساطة وفهم تقريبًا كمحدد jQuery من جانب الخادم. مع ذلك ، فهو أكثر سهولة من العادية
ثَبَّتَ
نسخة الكود كما يلي:
NPM تثبيت Cheeseio
طلب (url ، وظيفة (err ، الدقة ، الجسم) {
var html = iconv.decode (الجسم ، 'GB2312')
var $ = cheeseio.load (html)
console.log ($ ('h1'). text ())
console.log ($ ('H1'). html ())
})
الإخراج كما يلي
نسخة الكود كما يلي:
netease
netease
لذا فإن السؤال هو أن إخراج الكود بمقدار $ ('H1'). html () مشفر وحيد ، وأصبح netease netease ، مما تسبب في بعض المتاعب في معالجة الشخصيات لدينا.
حل مشكلة "Garled" في Cheatio.html ()
بالنظر إلى الوثائق ، يمكنك إيقاف تشغيل وظيفة تشفير الكيان.
نسخة الكود كما يلي:
var $ = cheeseio.load (html)
التغيير إلى
نسخة الكود كما يلي:
var $ = cheeseio.load (html ، {decodeentities: false})
هذا صحيح ، الرمز الكامل هو كما يلي:
نسخة الكود كما يلي:
var OriginRequest = require ('request')
var cheeseio = طلب ('Cheerio')
var iconv = require ('iconv-lite')
رؤوس var = {
"عامل المستخدم": "Mozilla/5.0 (Macintosh ؛ Intel Mac OS X 10_10_1) AppleWebkit/537.36 (KHTML ، مثل Gecko) Chrome/39.0.2171.65 Safari/537.36"
}
طلب الوظيفة (URL ، رد الاتصال) {
خيارات var = {
عنوان URL: URL ،
الترميز: لاغية ،
الرؤوس: الرؤوس
}
OriginRequest (الخيارات ، رد الاتصال)
}
var url = 'http://www.163.com'
طلب (url ، وظيفة (err ، الدقة ، الجسم) {
var html = iconv.decode (الجسم ، 'GB2312')
var $ = cheeseio.load (html ، {decodeentities: false})
console.log ($ ('h1'). text ())
console.log ($ ('H1'). html ())
})