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的事件描述
Sep 08 Javascript
Jquery 基础学习笔记之文档处理
May 29 Javascript
javascript字母大小写转换的4个函数详解
May 09 Javascript
JavaScript实现防止网页被嵌入Frame框架的代码分享
Dec 29 Javascript
jQuery树形下拉菜单特效代码分享
Aug 15 Javascript
JavaScript对象数组如何按指定属性和排序方向进行排序
Jun 15 Javascript
jQuery Validate让普通按钮触发表单验证的方法
Dec 15 Javascript
详解基于Vue+Koa的pm2配置
Oct 24 Javascript
如何让你的JS代码更好看易读
Dec 01 Javascript
微信小程序 冒泡事件原理解析
Sep 27 Javascript
使用layui监听器监听select下拉框,事件绑定不成功的解决方法
Sep 28 Javascript
区分vue-router的hash和history模式
Oct 03 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 获取本机外网/公网IP的代码
2010/05/09 PHP
PHP与MongoDB简介|安全|M+PHP应用实例详解
2013/06/17 PHP
PHP加密函数 Javascript/Js 解密函数
2013/09/23 PHP
PHP批量生成静态HTML的简单原理和方法
2014/04/20 PHP
php递归函数怎么用才有效
2018/02/24 PHP
js 与或运算符 || && 妙用
2009/12/09 Javascript
基于jquery可配置循环左右滚动例子
2011/09/09 Javascript
javascript权威指南 学习笔记之变量作用域分享
2011/09/28 Javascript
JS 按钮点击触发(兼容IE、火狐)
2013/08/07 Javascript
ext中store.load跟store.reload的区别示例介绍
2014/06/17 Javascript
JavaScript获取图片真实大小代码实例
2014/09/24 Javascript
js clearInterval()方法的定义和用法
2015/11/11 Javascript
JavaScript模块化开发之SeaJS
2015/12/13 Javascript
Node.js利用debug模块打印出调试日志的方法
2017/04/25 Javascript
Node.js实现发送邮件功能
2017/11/06 Javascript
详解Vue 事件修饰符capture 的使用
2017/12/29 Javascript
vue.js中实现登录控制的方法示例
2018/04/23 Javascript
elementUI table表格动态合并的示例代码
2019/05/15 Javascript
vscode中eslint插件的配置(prettier配置无效)
2019/09/10 Javascript
Node.js学习之内置模块fs用法示例
2020/01/22 Javascript
[03:54]DOTA2英雄梦之声_第06期_昆卡
2014/06/23 DOTA
举例讲解Python中的list列表数据结构用法
2016/03/12 Python
Python中的with语句与上下文管理器学习总结
2016/06/28 Python
浅谈tensorflow中几个随机函数的用法
2018/07/27 Python
详解Python进阶之切片的误区与高级用法
2018/12/24 Python
利用ctypes获取numpy数组的指针方法
2019/02/12 Python
对python 中class与变量的使用方法详解
2019/06/26 Python
Django Rest framework三种分页方式详解
2019/07/26 Python
Python列表(list)所有元素的同一操作解析
2019/08/01 Python
浅析两列自适应布局的3种思路
2016/05/03 HTML / CSS
新西兰第一的行李箱网站:luggage.co.nz
2019/07/22 全球购物
Kickers鞋英国官网:男士、女士和儿童鞋
2021/03/08 全球购物
心理健康活动总结
2014/04/30 职场文书
同学聚会策划方案
2014/06/06 职场文书
《中国梦我的梦》大学生演讲稿
2014/08/20 职场文书
2015元旦文艺汇演主持稿(开场白+结束语)
2014/12/14 职场文书