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 相关文章推荐
jQueryUI写一个调整分类的拖放效果实现代码
May 10 Javascript
jquery 实现input输入什么div图层显示什么
Jun 15 Javascript
JS实现仿QQ面板的手风琴效果折叠菜单代码
Sep 11 Javascript
在Javascript操作JSON对象,增加 删除 修改的简单实现
Jun 02 Javascript
JS操作xml对象转换为Json对象示例
Mar 25 Javascript
JavaScript动态绑定详解
Sep 14 Javascript
js数组常用最重要的方法
Feb 04 Javascript
vue-cli脚手架的安装教程图解
Sep 02 Javascript
angularJS实现不同视图同步刷新详解
Oct 09 Javascript
electron中使用bootstrap的示例代码
Nov 06 Javascript
在vue中使用G2图表的示例代码
Mar 19 Javascript
JS实现水平遍历和嵌套递归操作示例
Aug 15 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中GET变量的使用
2006/10/09 PHP
PHP初学入门
2006/11/19 PHP
PHP中new static()与new self()的区别异同分析
2014/08/22 PHP
php使用正则表达式获取图片url的方法
2015/01/16 PHP
PHP获取链表中倒数第K个节点的方法
2018/01/18 PHP
php中加密解密DES类的简单使用方法示例
2020/03/26 PHP
给moz-firefox下添加IE方法和属性
2007/04/10 Javascript
简单的代码实现jquery定时器
2013/11/17 Javascript
JavaScript事件详细讲解
2016/06/27 Javascript
js内置对象处理_打印学生成绩单的简单实现
2016/09/24 Javascript
JavaScript中splice与slice的区别
2017/05/09 Javascript
Angular 2.0+ 的数据绑定的实现示例
2017/08/09 Javascript
详解a++和++a的区别
2017/08/30 Javascript
解决vue 路由变化页面数据不刷新的问题
2018/03/13 Javascript
angularjs 的数据绑定实现原理
2018/07/02 Javascript
vue+element的表格实现批量删除功能示例代码
2018/08/17 Javascript
JS实现省市县三级下拉联动
2020/04/10 Javascript
Python中的模块导入和读取键盘输入的方法
2015/10/16 Python
Python语言实现获取主机名根据端口杀死进程
2016/03/31 Python
Python入门_浅谈for循环、while循环
2017/05/16 Python
itchat和matplotlib的结合使用爬取微信信息的实例
2017/08/25 Python
Python使用numpy模块创建数组操作示例
2018/06/20 Python
python开发游戏的前期准备
2019/05/05 Python
Python英文文章词频统计(14份剑桥真题词频统计)
2019/10/13 Python
wxpython+pymysql实现用户登陆功能
2019/11/19 Python
python 字典访问的三种方法小结
2019/12/05 Python
Python实现打包成库供别的模块调用
2020/07/13 Python
HTML5实现视频直播功能思路详解
2017/11/16 HTML / CSS
新西兰最大、占有率最高的综合性药房:PharmacyDirect药房中文网
2020/11/03 全球购物
实习护理工作自我评价
2013/09/25 职场文书
优秀班主任材料
2014/12/16 职场文书
2015年母亲节活动总结
2015/02/10 职场文书
特岗教师个人总结
2015/02/10 职场文书
2016医师资格考试考生诚信考试承诺书
2016/03/25 职场文书
有关信念的名言语录集锦
2019/12/06 职场文书
OpenCV实现普通阈值
2021/11/17 Java/Android