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 相关文章推荐
基于jquery的设置页面文本框 只能输入数字的实现代码
Apr 19 Javascript
thinkphp中常用的系统常量和系统变量
Mar 05 Javascript
IE 下Enter提交表单存在重复提交问题的解决方法
May 04 Javascript
tuzhu_req.js 实现仿百度图片首页效果
Aug 11 Javascript
jQuery EasyUI编辑DataGrid用combobox实现多级联动
Aug 29 Javascript
jQuery实现简单的tab标签页效果
Sep 12 Javascript
使用jQuery监听扫码枪输入并禁止手动输入的实现方法(推荐)
Mar 21 jQuery
Angular2里获取(input file)上传文件的内容的方法
Sep 05 Javascript
javascript实现文本框标签验证的实例代码
Oct 14 Javascript
iview实现select tree树形下拉框的示例代码
Dec 21 Javascript
p5.js临摹旋转爱心
Oct 23 Javascript
vue 使用localstorage实现面包屑的操作
Nov 16 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
各种咖啡的英文名子是什么
2021/03/03 新手入门
使用phpQuery采集网页的方法
2013/11/13 PHP
php获取指定范围内最接近数的方法
2015/06/02 PHP
win7系统配置php+Apache+mysql环境的方法
2015/08/21 PHP
php使用curl通过代理获取数据的实现方法
2016/05/16 PHP
PHP 7.1中AES加解密方法mcrypt_module_open()的替换方案
2017/10/17 PHP
PHP双向链表定义与用法示例
2018/01/31 PHP
JS中Iframe之间传值及子页面与父页面应用
2013/03/11 Javascript
JavaScript实现找出数组中最长的连续数字序列
2014/09/03 Javascript
javascript模拟php函数in_array
2015/04/27 Javascript
javascript 闭包详解
2015/07/02 Javascript
jQuery ajax的功能实现方法详解
2017/01/06 Javascript
Angular.js跨controller实现参数传递的两种方法
2017/02/20 Javascript
JavaScript中利用Array filter() 方法压缩稀疏数组
2018/02/24 Javascript
vue 获取视频时长的实例代码
2019/08/20 Javascript
[00:56]PWL开团时刻DAY8——追追追追追!
2020/11/09 DOTA
利用Python在一个文件的头部插入数据的实例
2018/05/02 Python
matplotlib subplots 调整子图间矩的实例
2018/05/25 Python
python实现Zabbix-API监控
2018/09/17 Python
Python面向对象程序设计类的封装与继承用法示例
2019/04/12 Python
python3中sorted函数里cmp参数改变详解
2020/03/12 Python
使用CSS3的font-face字体嵌入样式的方法讲解
2016/05/13 HTML / CSS
纯CSS3制作页面切换效果的实例代码
2019/05/30 HTML / CSS
公司市场部岗位职责
2013/12/02 职场文书
洗煤厂厂长岗位职责
2014/01/03 职场文书
房产委托公证书样本
2014/04/04 职场文书
监察建议书格式
2014/05/19 职场文书
就业意向书
2014/07/29 职场文书
2014个人反腐倡廉思想汇报
2014/09/15 职场文书
杭州西湖英语导游词
2015/02/03 职场文书
接待员岗位职责
2015/02/13 职场文书
城南旧事电影观后感
2015/06/16 职场文书
CSS 还能这样玩?奇思妙想渐变的艺术
2021/04/27 HTML / CSS
pytorch实现手写数字图片识别
2021/05/20 Python
python实现A*寻路算法
2021/06/13 Python
仅用几行Python代码就能复制她的U盘文件?
2021/06/26 Python