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保存、读取、换行、转Json报错处理方法
Jun 14 Javascript
捕获和分析JavaScript Error的方法
Mar 25 Javascript
JavaScript获取flash对象与网上的有所不同
Apr 21 Javascript
Jquery图片延迟加载插件jquery.lazyload.js的使用方法
May 21 Javascript
js监听鼠标事件控制textarea输入字符串的个数
Sep 29 Javascript
node.js中的fs.mkdir方法使用说明
Dec 17 Javascript
javascript和jquery实现设置和移除文本框默认值效果代码
Jan 13 Javascript
浅谈JSON中stringify 函数、toJosn函数和parse函数
Jan 26 Javascript
使用jQuery操作HTML的table表格的实例解析
Mar 13 Javascript
在localStorage中存储对象数组并读取的方法
Sep 24 Javascript
Angularjs使用指令做表单校验的方法
Mar 31 Javascript
js根据json数据中的某一个属性来给数据分组的方法
Oct 08 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中$this->含义分析
2009/11/29 PHP
php中curl、fsocket、file_get_content三个函数的使用比较
2014/05/09 PHP
在Mac OS上搭建Nginx+PHP+MySQL开发环境的教程
2015/12/21 PHP
php魔法函数与魔法常量使用介绍
2017/07/23 PHP
用函数式编程技术编写优美的 JavaScript
2006/11/25 Javascript
传递参数的标准方法(jQuery.ajax)
2008/11/19 Javascript
自动完成JS类(纯JS, Ajax模式)
2009/03/12 Javascript
jquery入门—编写一个导航条(可伸缩)
2013/01/07 Javascript
基于jquery实现点击左右按钮图片横向滚动
2013/04/11 Javascript
js 点击页面其他地方关闭弹出层(示例代码)
2013/12/24 Javascript
Nodejs express框架一个工程中同时使用ejs模版和jade模版
2015/12/28 NodeJs
JavaScript实现时间倒计时跳转(推荐)
2016/06/28 Javascript
微信小程序图片横向左右滑动案例
2017/05/19 Javascript
JS 60秒后重新发送验证码的实例讲解
2017/07/26 Javascript
promise处理多个相互依赖的异步请求(实例讲解)
2017/08/03 Javascript
js es6系列教程 - 基于new.target属性与es5改造es6的类语法
2017/09/02 Javascript
JS获取动态添加元素的方法详解
2019/07/31 Javascript
Vue作用域插槽实现方法及作用详解
2020/07/08 Javascript
8个非常实用的Vue自定义指令
2020/12/15 Vue.js
[27:28]Ti4 冒泡赛第二天 iG vs NEWBEE 1
2014/07/15 DOTA
在python的WEB框架Flask中使用多个配置文件的解决方法
2014/04/18 Python
python从网络读取图片并直接进行处理的方法
2015/05/22 Python
Python实现定时备份mysql数据库并把备份数据库邮件发送
2018/03/08 Python
django实现支付宝支付实例讲解
2019/10/17 Python
Python实现栈和队列的简单操作方法示例
2019/11/29 Python
执行Python程序时模块报错问题
2020/03/26 Python
python中scrapy处理项目数据的实例分析
2020/11/22 Python
Python项目实战之使用Django框架实现支付宝付款功能
2021/02/23 Python
HTML5适合的情人节礼物有纪念日期功能
2021/01/25 HTML / CSS
Expedia西班牙:预订酒店、机票、旅行和廉价度假套餐
2019/04/10 全球购物
值传递还是引用传递
2015/02/08 面试题
工商干部先进事迹
2014/05/14 职场文书
2014年大学班长工作总结
2014/11/14 职场文书
《火烧云》教学反思
2016/02/23 职场文书
房屋买卖定金协议书
2016/03/21 职场文书
js不常见操作运算符总结
2021/11/20 Javascript