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入门学习资料收集整理篇
Jul 06 Javascript
获取鼠标在div中的相对位置的实现代码
Dec 30 Javascript
jquery实现鼠标拖动图片效果示例代码
Jan 09 Javascript
JS如何将数字类型转化为没3个一个逗号的金钱格式
Jan 27 Javascript
jquery防止重复执行动画避免页面混乱
Apr 22 Javascript
JavaScript各类型的关系图解
Oct 16 Javascript
JQuery实现图片轮播效果
May 08 jQuery
angular2 ng2-file-upload上传示例代码
Aug 23 Javascript
JavaScript中this的全面解析及常见实例
May 14 Javascript
Vue实现点击显示不同图片的效果
Aug 10 Javascript
Vue项目前后端联调(使用proxyTable实现跨域方式)
Jul 18 Javascript
vue中defineProperty和Proxy的区别详解
Nov 30 Vue.js
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 mssql 日期出现中文字符的解决方法
2009/03/10 PHP
PHP 获取指定地区的天气实例代码
2017/02/08 PHP
PHP html_entity_decode()函数讲解
2019/02/25 PHP
defer属性导致引用JQuery的页面报“浏览器无法打开网站xxx,操作被中止”错误的解决方法
2010/04/27 Javascript
基于Asp.net与Javascript控制的日期控件
2010/05/22 Javascript
js,jq,css多方面实现简易下拉菜单功能
2017/05/13 Javascript
Mongoose实现虚拟字段查询的方法详解
2017/08/15 Javascript
jQuery ajax调用webservice注意事项
2017/10/08 jQuery
react实现一个优雅的图片占位模块组件详解
2017/10/30 Javascript
微信小程序实现两边小中间大的轮播效果的示例代码
2018/12/07 Javascript
vue.js实现会动的简历(包含底部导航功能,编辑功能)
2019/04/08 Javascript
Vue实现将数据库中带html标签的内容输出(原始HTML(Raw HTML))
2019/10/28 Javascript
js中位数不足自动补位扩展padLeft、padRight实现代码
2020/04/06 Javascript
ant-design-vue按需加载的坑的解决
2020/05/14 Javascript
详解Python中类的定义与使用
2017/04/11 Python
python 监听salt job状态,并任务数据推送到redis中的方法
2019/01/14 Python
python线程安全及多进程多线程实现方法详解
2019/09/27 Python
Python shutil模块用法实例分析
2019/10/02 Python
Python更新所有已安装包的操作
2020/02/13 Python
python_mask_array的用法
2020/02/18 Python
python topk()函数求最大和最小值实例
2020/04/02 Python
Python常用数字处理基本操作汇总
2020/09/10 Python
英国评分最高的女性剃须刀订阅盒:FFS Beauty
2018/01/25 全球购物
英国最大的自有市场,比亚马逊便宜:Flubit
2019/03/19 全球购物
教师自荐信
2013/12/10 职场文书
旅游网创业计划书
2014/01/31 职场文书
市场营销个人求职信范文
2014/02/02 职场文书
爱情保证书大全
2014/04/29 职场文书
大学生社会实践方案
2014/05/11 职场文书
老员工辞职信范文
2015/05/12 职场文书
婚庆司仪开场白
2015/05/29 职场文书
领导离职感言
2015/08/03 职场文书
教师旷工检讨书
2015/08/15 职场文书
公司中层管理培训心得体会
2016/01/11 职场文书
python绘制简单直方图(质量分布图)的方法
2022/04/21 Python
Python如何快速找到多个字典中的公共键(key)
2022/04/29 Python