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 相关文章推荐
一步一步制作jquery插件Tabs实现过程
Jul 06 Javascript
javascript (用setTimeout而非setInterval)
Dec 28 Javascript
Javascript 面向对象(二)封装代码
May 23 Javascript
javascript实现控制浏览器全屏
Mar 30 Javascript
jQuery实现信息提示框(带有圆角框与动画)效果
Aug 07 Javascript
通过隐藏iframe实现无刷新上传文件操作
Mar 16 Javascript
浅谈js原生拖放
Nov 21 Javascript
详解Angular.js指令中scope类型的几种特殊情况
Feb 21 Javascript
详解ES6中的代理模式——Proxy
Jan 08 Javascript
js 将线性数据转为树形的示例代码
May 28 Javascript
vue登录页面cookie的使用及页面跳转代码
Jul 10 Javascript
js 实现ajax发送步骤过程详解
Jul 25 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模拟socket一次连接,多次发送数据的实现代码
2011/07/26 PHP
[原创]php简单隔行变色功能实现代码
2016/07/09 PHP
详谈PHP中的密码安全性Password Hashing
2017/02/04 PHP
脚本安需导入(装载)的三种模式的对比
2007/06/24 Javascript
JavaScript 事件记录使用说明
2009/10/20 Javascript
Riot.js 快速的JavaScript单元测试框架
2009/11/09 Javascript
jQuery实现图片预加载效果
2015/11/27 Javascript
纯JS代码实现隔行变色鼠标移入高亮
2016/11/23 Javascript
jquery实现提示语淡入效果
2017/05/05 jQuery
angularjs实现过滤并替换关键字小功能
2017/09/19 Javascript
vue实现消息的无缝滚动效果的示例代码
2017/12/05 Javascript
浅谈SpringMVC中post checkbox 多选框value的值(隐藏域方式)
2018/01/08 Javascript
JS重学系列之聊聊new操作符
2019/03/04 Javascript
解决vue自定义全局消息框组件问题
2019/11/22 Javascript
python 判断一个进程是否存在
2009/04/09 Python
python操作gmail实例
2015/01/14 Python
Python 遍历子文件和所有子文件夹的代码实例
2016/12/21 Python
Python实现查找匹配项作处理后再替换回去的方法
2017/06/10 Python
python生成随机图形验证码详解
2017/11/08 Python
python 数字类型和字符串类型的相互转换实例
2018/07/17 Python
python实现密码强度校验
2020/03/18 Python
使用CSS3设计地图上的雷达定位提示效果
2016/04/05 HTML / CSS
Hotels.com中国区:好订网
2016/08/18 全球购物
全球酒店比价网:HotelsCombined
2017/06/20 全球购物
Madda Fella官网:美国冒险家服装品牌
2020/01/16 全球购物
运动会方阵解说词
2014/02/12 职场文书
优质服务活动实施方案
2014/05/02 职场文书
安全演讲稿开场白
2014/08/25 职场文书
2014年护理部工作总结
2014/11/14 职场文书
2015年五四青年节活动总结
2015/02/10 职场文书
个人党性锻炼总结
2015/03/05 职场文书
会计出纳岗位职责
2015/03/31 职场文书
2015年度公共机构节能工作总结
2015/05/26 职场文书
淮海战役观后感
2015/06/11 职场文书
2019年销售部季度工作计划3篇
2019/10/09 职场文书
python数据分析之单因素分析线性拟合及地理编码
2022/06/25 Python