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 相关文章推荐
Javascript 原型和继承(Prototypes and Inheritance)
Apr 01 Javascript
js与jquery获取父元素,删除子元素的两种不同方法
Jan 09 Javascript
jQuery判断checkbox(复选框)是否被选中以及全选、反选实现代码
Feb 21 Javascript
Javascript中call与apply的学习笔记
Sep 22 Javascript
JavaScript控制图片加载完成后调用回调函数的方法
Mar 20 Javascript
jQuery原型属性和原型方法详解
Jul 07 Javascript
如何使用jquery easyui创建标签组件
Nov 18 Javascript
SpringMVC+bootstrap table实例详解
Jun 02 Javascript
vue-router2.0 组件之间传参及获取动态参数的方法
Nov 10 Javascript
JavaScript使用享元模式实现文件上传优化操作示例
Aug 07 Javascript
详解Node.js amqplib 连接 Rabbit MQ最佳实践
Jan 24 Javascript
JS根据json数组多个字段排序及json数组常用操作
Jun 06 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
杏林同学录(二)
2006/10/09 PHP
PHP与SQL注入攻击[三]
2007/04/17 PHP
PHP XML数据解析代码
2010/05/26 PHP
浅谈php+phpStorm+xdebug配置方法
2015/09/17 PHP
PHP实现通过strace定位故障原因的方法
2018/04/29 PHP
php使用gearman进行任务分发操作实例详解
2020/02/26 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
2020/04/02 PHP
载入进度条 效果
2006/07/08 Javascript
发布BlueShow v1.0 图片浏览器(类似lightbox)blueshow.js 打包下载
2007/07/21 Javascript
jquery 操作单选框,复选框,下拉列表实现代码
2009/10/27 Javascript
boxy基于jquery的弹出层对话框插件扩展应用 弹出层选择器
2010/11/21 Javascript
jQuery:节点(插入,复制,替换,删除)操作
2013/03/04 Javascript
jquery触发a标签跳转事件示例代码
2013/07/21 Javascript
JSuggest自动匹配下拉框使用方法(示例代码)
2013/12/27 Javascript
JavaScript window.location对象
2014/11/14 Javascript
JavaScript DOM元素尺寸和位置
2015/04/13 Javascript
C#中使用迭代器处理等待任务
2015/07/13 Javascript
js实现固定显示区域内自动缩放图片的方法
2015/07/18 Javascript
jQuery CSS3相结合实现时钟插件
2016/01/08 Javascript
微信小程序 HTTPS报错整理常见问题及解决方案
2016/12/14 Javascript
jQuery拖拽通过八个点改变div大小
2020/11/29 Javascript
jQuery图片瀑布流的简单实现代码
2017/03/15 Javascript
nodejs判断文件、文件夹是否存在及删除的方法
2017/11/10 NodeJs
Node.js+Express+Mysql 实现增删改查
2019/04/03 Javascript
微信小程序把百度地图坐标转换成腾讯地图坐标过程详解
2019/07/10 Javascript
解决在layer.open中使用时间控件laydate失败的问题
2019/09/11 Javascript
Python 实现随机数详解及实例代码
2017/04/15 Python
python的Tqdm模块的使用
2018/01/10 Python
Python字符串逆序输出的实例讲解
2019/02/16 Python
python通过TimedRotatingFileHandler按时间切割日志
2019/07/17 Python
纽约手袋品牌:KARA
2018/03/18 全球购物
社区安全检查制度
2014/02/03 职场文书
工会工作先进事迹
2014/08/18 职场文书
2014年施工员工作总结
2014/11/18 职场文书
《鸡兔同笼》教学反思
2016/02/19 职场文书
六年级作文之预言作文
2019/10/25 职场文书