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 BASE64编码 window.atob(), window.btoa()
Mar 09 Javascript
[Web]防止用户复制页面内容和另存页面的方法
Feb 06 Javascript
js中单引号与双引号冲突问题解决方法
Oct 04 Javascript
jQuery制作仿Mac Lion OS滚动条效果
Feb 10 Javascript
JS实现的自定义网页拖动类
Nov 06 Javascript
web 屏蔽BackSpace键实例代码
Dec 24 Javascript
React Hooks 实现和由来以及解决的问题详解
Jan 17 Javascript
6种JavaScript继承方式及优缺点(小结)
Feb 06 Javascript
解决Vue中使用keepAlive不缓存问题
Aug 04 Javascript
jquery实现鼠标悬浮弹出气泡提示框
Dec 23 jQuery
详解TS数字分隔符和更严格的类属性检查
May 06 Javascript
vue ref如何获取子组件属性值
Mar 31 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 JSON出错:Cannot use object of type stdClass as array解决方法
2014/08/16 PHP
php通过curl模拟登陆DZ论坛
2015/05/11 PHP
php中简单的对称加密算法实现
2017/01/05 PHP
php+js实现的拖动滑块验证码验证表单操作示例【附源码下载】
2020/05/27 PHP
可以将word转成html的js代码
2010/04/11 Javascript
JS模拟面向对象全解(一、类型及传递)
2011/07/13 Javascript
解析使用JS 清空File控件的路径值
2013/07/08 Javascript
node.js中的http.response.write方法使用说明
2014/12/14 Javascript
jquery简单插件制作(fn.extend)完整实例
2016/05/24 Javascript
Nodejs中 npm常用命令详解
2016/07/04 NodeJs
AngularJS equal比较对象实例详解
2016/09/14 Javascript
微信小程序 canvas API详解及实例代码
2016/10/08 Javascript
浅谈angularjs $http提交数据探索
2017/01/20 Javascript
AngularJS中的路由使用及实现代码
2017/10/09 Javascript
解决ant Design中this.props.form.validateFields未执行的问题
2020/10/27 Javascript
node中短信api实现验证码登录的示例代码
2021/01/20 Javascript
Python实现类继承实例
2014/07/04 Python
Python的另外几种语言实现
2015/01/29 Python
Python脚本简单实现打开默认浏览器登录人人和打开QQ的方法
2016/04/12 Python
python将txt文档每行内容循环插入数据库的方法
2018/12/28 Python
详解opencv Python特征检测及K-最近邻匹配
2019/01/21 Python
Python3获取拉勾网招聘信息的方法实例
2019/04/03 Python
PyCharm搭建Spark开发环境实现第一个pyspark程序
2019/06/13 Python
浅析CSS3 用text-overflow解决文字排版问题
2020/10/28 HTML / CSS
canvas如何实现多张图片编辑的图片编辑器
2020/03/10 HTML / CSS
国际知名设计师时装商店:Coggles
2016/09/05 全球购物
联想法国官方网站:Lenovo法国
2018/10/18 全球购物
利物浦足球俱乐部官方商店(美国):Liverpool FC US
2019/10/09 全球购物
struct与class的区别
2014/02/03 面试题
Does C# support multiple inheritance? (C#支持多重继承吗)
2012/01/04 面试题
骨干教师考核方案
2014/05/09 职场文书
公司离职证明标准样本
2014/10/05 职场文书
幼儿园教师师德表现自我评价
2015/03/05 职场文书
大学学习委员竞选稿
2015/11/20 职场文书
2019个人年度目标制定攻略!
2019/07/12 职场文书
SpringBoot全局异常处理方案分享
2022/05/25 Java/Android