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 相关文章推荐
Packer 3.0 JS压缩及混淆工具 下载
May 03 Javascript
Javascript的匿名函数小结
Dec 31 Javascript
jQuery实战之仿淘宝商城左侧导航效果
Apr 12 Javascript
javascript 正则表达式相关应介绍
Nov 27 Javascript
jqeury-easyui-layout问题解决方法
Mar 24 Javascript
JS实现回到页面顶部动画效果的简单实例
May 24 Javascript
javascript js 操作数组 增删改查的简单实现
Jun 20 Javascript
老生常谈javascript的类型转换
Oct 12 Javascript
Vue.js第二天学习笔记(vue-router)
Dec 01 Javascript
微信小程序加载机制及运行机制图解
Nov 27 Javascript
vue通过v-html指令渲染的富文本无法修改样式的解决方案
May 20 Javascript
详解datagrid使用方法(重要)
Nov 06 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
Apache环境下PHP利用HTTP缓存协议原理解析及应用分析
2010/02/16 PHP
Smarty的配置与高级缓存技术分享
2012/06/05 PHP
PHP面向对象之旅:深入理解static变量与方法
2014/01/06 PHP
PHP微信公众号开发之微信红包实现方法分析
2017/07/14 PHP
浅谈javascript中createElement事件
2014/12/05 Javascript
深入理解JavaScript的React框架的原理
2015/07/02 Javascript
JavaScript简单实现鼠标移动切换图片的方法
2016/02/23 Javascript
微信小程序开发之实现选项卡(窗口顶部TabBar)页面切换
2016/11/25 Javascript
JavaScript基于replace+正则实现ES6的字符串模版功能
2017/04/25 Javascript
Nuxt.js实战详解
2018/01/18 Javascript
vue 1.0 结合animate.css定义动画效果
2018/07/11 Javascript
微信小程序登录按钮遮罩浮层效果的实现方法
2018/12/16 Javascript
JavaScript实现轮播图片完整代码
2020/03/07 Javascript
javascript实现贪吃蛇游戏(娱乐版)
2020/08/17 Javascript
如何在Express4.x中愉快地使用async的方法
2020/11/18 Javascript
[37:29]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第二场 11.19
2020/11/19 DOTA
Python中input和raw_input的一点区别
2014/10/21 Python
python基础教程之五种数据类型详解
2017/01/12 Python
Python数据结构之双向链表的定义与使用方法示例
2018/01/16 Python
python numpy数组的索引和切片的操作方法
2018/10/20 Python
python实现多层感知器MLP(基于双月数据集)
2019/01/18 Python
python3实现斐波那契数列(4种方法)
2019/07/15 Python
python 实现GUI(图形用户界面)编程详解
2019/07/17 Python
Python简易计算器制作方法代码详解
2019/10/31 Python
Python 获取numpy.array索引值的实例
2019/12/06 Python
Rosetta Stone官方网站:语言学习
2019/01/05 全球购物
如何减少垃圾回收让内存更加有效使用
2013/10/18 面试题
为什么要优先使用同步代码块而不是同步方法?
2013/01/30 面试题
制冷与电控专业应届生求职信
2013/11/11 职场文书
《影子》教学反思
2014/02/21 职场文书
培训专员岗位职责
2014/02/26 职场文书
酒店保安领班职务说明书
2014/03/04 职场文书
项目工作说明书
2014/07/29 职场文书
大学学生会辞职信
2015/05/13 职场文书
XX部保密工作制度范本
2019/08/27 职场文书
导游词之上海杜莎夫人蜡像馆
2019/11/22 职场文书