Node.js抓取中文网页乱码问题和解决方法


Posted in Javascript onFebruary 10, 2015

Node.js 抓取非 utf-8 的中文网页时会出现乱码问题,比如网易的首页编码是 gb2312,抓取时会出现乱码

var request = require('request')  

var url = 'http://www.163.com'
request(url, function (err, res, body) {  

    console.log(body)

})

可以使用 iconv-lite 来解决

安装

npm install iconv-lite 

同时我们顺带把 user-agent 修改一下,以防网站屏蔽:
var originRequest = require('request')  

var iconv = require('iconv-lite')  

var headers = {  

  'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.65 Safari/537.36'

}
function request (url, callback) {  

  var options = {

    url: url,

    encoding: null,

    headers: headers

  }

  originRequest(options, callback)

}
request(url, function (err, res, body) {  

    var html = iconv.decode(body, 'gb2312')

    console.log(html)

})

乱码问题解决

使用 cheerio 解析 HTML

cheerio 可以简单粗暴的理解为服务器端 jQuery 选择器,有了它,比正则要更加直观许多

安装

npm install cheerio  

request(url, function (err, res, body) {  

    var html = iconv.decode(body, 'gb2312')

    var $ = cheerio.load(html)

    console.log($('h1').text())

    console.log($('h1').html())

})

输出如下
网易

网易

那么问题来了,$('h1').html() 输出的代码是经过 Unicode 编码的,网易变成了网易,给我们的字符处理带来了一些麻烦

解决 cheerio .html() 「乱码」问题
查阅文档可知,可以关闭这个转换实体编码的功能

var $ = cheerio.load(html) 

改成
var $ = cheerio.load(html, {decodeEntities: false})

即可,完整代码如下:
var originRequest = require('request')  

var cheerio = require('cheerio')  

var iconv = require('iconv-lite')  

var headers = {  

  'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.65 Safari/537.36'

}
function request (url, callback) {  

  var options = {

    url: url,

    encoding: null,

    headers: headers

  }

  originRequest(options, callback)

}
var url = 'http://www.163.com'
request(url, function (err, res, body) {  

    var html = iconv.decode(body, 'gb2312')

    var $ = cheerio.load(html, {decodeEntities: false})

    console.log($('h1').text())

    console.log($('h1').html())

})
Javascript 相关文章推荐
Extjs学习笔记之六 面版
Jan 08 Javascript
基于JQuery制作的产品广告效果
Dec 08 Javascript
js实现文字在按钮上滚动的方法
Aug 20 Javascript
javascript事件委托的用法及其好处简析
Apr 04 Javascript
JavaScript编码风格指南(中文版)
Aug 26 Javascript
浅谈js数据类型判断与数组判断
Aug 29 Javascript
jQuery在ie6下无法设置select选中的解决方法详解
Sep 20 Javascript
BootStrapTable服务器分页实例解析
Dec 20 Javascript
Jquery EasyUI Datagrid右键菜单实现方法
Dec 30 Javascript
JS数组去重(4种方法)
Mar 27 Javascript
微信小程序实战之自定义抽屉菜单(7)
Apr 18 Javascript
Angularjs的$http异步删除数据详解及实例
Jul 27 Javascript
JS数组的常见用法实例
Feb 10 #Javascript
bootstrap table 服务器端分页例子分享
Feb 10 #Javascript
js实现对table动态添加、删除和更新的方法
Feb 10 #Javascript
js+css实现导航效果实例
Feb 10 #Javascript
jquery.mobile 共同布局遇到的问题小结
Feb 10 #Javascript
jquery中EasyUI使用技巧小结
Feb 10 #Javascript
javascript操作符"!~"详解
Feb 10 #Javascript
You might like
关于php fread()使用技巧
2010/01/22 PHP
php实现cc攻击防御和防止快速刷新页面示例
2014/02/13 PHP
PHP中常用的输出函数总结
2014/09/22 PHP
跟我学Laravel之路由
2014/10/15 PHP
php7基于递归实现删除空文件夹的方法示例
2017/06/15 PHP
yii2.0框架实现上传excel文件后导入到数据库的方法示例
2020/04/13 PHP
JS request函数 用来获取url参数
2010/05/17 Javascript
Chosen 基于jquery的选择框插件使用方法
2012/05/30 Javascript
JavaScript语言核心数据类型和变量使用介绍
2013/08/23 Javascript
在JS中操作时间之getUTCMilliseconds()方法的使用
2015/06/10 Javascript
一波JavaScript日期判断脚本分享
2016/03/06 Javascript
JS经典正则表达式笔试题汇总
2016/12/15 Javascript
详解JS去重及字符串奇数位小写转大写
2016/12/29 Javascript
vue内置组件transition简单原理图文详解(小结)
2018/07/12 Javascript
浅析微信扫码登录原理(小结)
2018/10/29 Javascript
zepto.js 实时监听输入框的方法
2018/12/04 Javascript
深入理解基于vue-cli的webpack打包优化实践及探索
2019/10/14 Javascript
vue中的过滤器及其时间格式化问题
2020/04/09 Javascript
[01:41]DOTA2超级联赛专访YYF 称一辈子难忘TI2
2013/05/28 DOTA
Python绘制的二项分布概率图示例
2018/08/22 Python
[原创]Python入门教程4. 元组基本操作
2018/10/31 Python
在Python中将函数作为另一个函数的参数传入并调用的方法
2019/01/22 Python
200行python代码实现2048游戏
2019/07/17 Python
python实现socket+threading处理多连接的方法
2019/07/23 Python
使用python动态生成波形曲线的实现
2019/12/04 Python
利用Pytorch实现简单的线性回归算法
2020/01/15 Python
HTML5学习笔记之History API
2015/02/26 HTML / CSS
HTML5中判断横屏竖屏的方法(移动端)
2016/08/04 HTML / CSS
澳大利亚在线家具店:Luxo Living
2019/03/24 全球购物
创业计划书中包含的9个方面
2013/12/26 职场文书
经费申请报告范文
2015/05/18 职场文书
2019年大学生学年自我鉴定!
2019/03/25 职场文书
职场新人刚入职工作总结该怎么写?
2019/05/15 职场文书
OpenCV-Python实现油画效果的实例
2021/06/08 Python
Python 处理表格进行成绩排序的操作代码
2021/07/26 Python
MyBatis在注解上使用动态SQL方式(@select使用if)
2022/07/07 Java/Android