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技巧之不要用for in语句对数组进行遍历
Oct 20 Javascript
根据邮箱的域名跳转到相应的登录页面的代码
Feb 27 Javascript
js实现拉伸拖动iframe的具体代码
Aug 03 Javascript
jQuery中使用data()方法读取HTML5自定义属性data-*实例
Apr 11 Javascript
jQuery中has()方法用法实例
Jan 06 Javascript
JavaScript正则表达式函数总结(常用)
Feb 22 Javascript
详解javascript中的变量提升和函数提升
May 24 Javascript
微信小程序倒计时功能实例代码
Jul 17 Javascript
详解vue通过NGINX部署在子目录或者二级目录实践
Sep 03 Javascript
vue element table 表格请求后台排序的方法
Sep 28 Javascript
vue-router的使用方法及含参数的配置方法
Nov 13 Javascript
详解js 创建对象的几种方法
Mar 08 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
解析CI即CodeIgniter框架在Nginx下的重写规则
2013/06/03 PHP
php中session过期时间设置及session回收机制介绍
2014/05/05 PHP
PHP删除指定目录中的所有目录及文件的方法
2015/02/26 PHP
PHP遍历数组的方法汇总
2015/04/30 PHP
php有效防止同一用户多次登录
2015/11/19 PHP
javascript模仿msgbox提示效果代码
2008/06/10 Javascript
JavaScript 高级篇之DOM文档,简单封装及调用、动态添加、删除样式(六)
2012/04/07 Javascript
jquery利用ajax调用后台方法实例
2013/08/23 Javascript
原生javascript图片自动或手动切换示例附演示源码
2013/09/04 Javascript
javascript获取url上某个参数的方法
2013/11/08 Javascript
jquery弹出层类代码分享
2013/12/27 Javascript
Jquery.Form 异步提交表单的简单实例
2014/03/03 Javascript
JQuery CheckBox(复选框)操作方法汇总
2015/04/15 Javascript
谈谈encodeURI和encodeURIComponent以及escape的区别与应用
2015/11/24 Javascript
JQuery的Pager分页器实现代码
2016/05/03 Javascript
jQuery表单插件ajaxForm实例详解
2017/01/17 Javascript
微信小程序 页面传值详解
2017/03/10 Javascript
weui框架实现上传、预览和删除图片功能代码
2017/08/24 Javascript
详解如何在vue-cli中使用vuex
2018/08/07 Javascript
在Node.js下运用MQTT协议实现即时通讯及离线推送的方法
2019/01/24 Javascript
vue-cli构建vue项目的步骤详解
2019/01/27 Javascript
[07:38]2014DOTA2国际邀请赛 Newbee顺利挺进胜者组赛后专访
2014/07/15 DOTA
[52:26]完美世界DOTA2联赛决赛 FTD vs Phoenix 第一场 11.08
2020/11/11 DOTA
python的正则表达式re模块的常用方法
2013/03/09 Python
python脚本内运行linux命令的方法
2015/07/02 Python
python实现分页效果
2017/10/25 Python
Python基础之列表常见操作经典实例详解
2020/02/26 Python
python利用tkinter实现图片格式转换的示例
2020/09/28 Python
Nip + Fab官网:英国美容品牌
2019/08/26 全球购物
生产车间实习自我鉴定
2013/09/23 职场文书
师范学院毕业生求职信范文
2013/12/26 职场文书
机关单位工作失职检讨书
2014/11/20 职场文书
2014年终个人总结报告
2015/03/09 职场文书
公司保洁员管理制度
2015/08/04 职场文书
2016年小学“感恩教师”主题队日活动总结
2016/04/01 职场文书
阿里云Nginx配置https实现域名访问项目(图文教程)
2021/03/31 Servers