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 相关文章推荐
在一个js文件里远程调用jquery.js会在ie8下的一个奇怪问题
Nov 28 Javascript
jquery实现心算练习代码
Dec 06 Javascript
jquery对表单操作2
Apr 06 Javascript
一行代码实现纯数据json对象的深度克隆实现思路
Jan 09 Javascript
如何将一个String和多个String值进行比较思路分析
Apr 22 Javascript
JS网页播放声音实现代码兼容各种浏览器
Sep 22 Javascript
判断输入是否为空,获得输入类型的JS代码
Oct 30 Javascript
使用jquery animate创建平滑滚动效果(可以是到顶部、到底部或指定地方)
May 27 Javascript
angular中ui calendar的一些使用心得(推荐)
Nov 03 Javascript
详解Vue+ElementUI从零开始搭建自己的网站(一、环境搭建)
Apr 30 Javascript
vue实现学生信息管理系统
May 30 Javascript
如何用JS模拟实现数组的map方法
Jul 30 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文件缓存内容保存格式实例分析
2014/08/20 PHP
php5.2的curl-bug 服务器被php进程卡死问题排查
2016/09/19 PHP
PHPExcel导出2003和2007的excel文档功能示例
2017/01/04 PHP
PHP 实现人民币小写转换成大写的方法及大小写转换函数
2017/11/17 PHP
php实现生成PDF文件的方法示例【基于FPDF类库】
2018/07/21 PHP
CSS JavaScript 实现菜单功能 改进版
2008/12/09 Javascript
js控制div及网页相关属性的代码
2009/12/19 Javascript
innerHTML 和 getElementsByName 在IE下面的bug 的解决
2010/04/09 Javascript
js 字符串转化成数字的代码
2011/06/29 Javascript
JavaScript面向对象(极简主义法minimalist approach)
2012/07/17 Javascript
JQuery实现用户名无刷新验证的小例子
2013/03/22 Javascript
Javascript异步编程模型Promise模式详细介绍
2014/05/08 Javascript
JavaScript获取元素尺寸和大小操作总结
2015/02/27 Javascript
AngularJs expression详解及简单示例
2016/09/01 Javascript
100多个基础常用JS函数和语法集合大全
2017/02/16 Javascript
老生常谈jquery中detach()和remove()的区别
2017/03/02 Javascript
详解VUE中常用的几种import(模块、文件)引入方式
2018/07/03 Javascript
Vue无限滑动周选择日期的组件的示例代码
2018/07/18 Javascript
微信小程序实现两个页面传值的方法分析
2018/12/11 Javascript
js中Array对象的常用遍历方法详解
2019/01/17 Javascript
Vue+Element UI+vue-quill-editor富文本编辑器及插入图片自定义
2019/08/20 Javascript
vue跳转同一个组件,参数不同,页面接收值只接收一次的解决方法
2019/11/05 Javascript
webpack+express实现文件精确缓存的示例代码
2020/06/11 Javascript
[03:04]DOTA2超级联赛专访ZSMJ “莫名其妙”的逆袭
2013/05/23 DOTA
python 矩阵增加一行或一列的实例
2018/04/04 Python
pandas.dataframe中根据条件获取元素所在的位置方法(索引)
2018/06/07 Python
numpy.linspace 生成等差数组的方法
2018/07/02 Python
Django跨域请求CSRF的方法示例
2018/11/11 Python
使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件及出现问题解决方法
2019/09/06 Python
python 两个一样的字符串用==结果为false问题的解决
2020/03/12 Python
英国在线药房:Chemist.co.uk
2019/03/26 全球购物
工商企业管理应届生求职信
2013/11/03 职场文书
网络编辑岗位职责范本
2014/02/10 职场文书
学习交流会主持词
2014/04/01 职场文书
护士工作失误检讨书
2014/09/14 职场文书
创业计划书之情侣餐厅
2019/09/29 职场文书