Node.js抓取中文网页乱码问题和解决方法

 更新时间:2015年02月10日 09:54:50   投稿:junjie  
这篇文章主要介绍了Node.js抓取中文网页乱码问题和解决方法,本文讲解了使用一些开源库解决抓取中出现的乱码问题,需要的朋友可以参考下

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())
})

相关文章

  • nodejs中操作mysql数据库示例

    nodejs中操作mysql数据库示例

    这篇文章主要介绍了nodejs中操作mysql数据库示例,本文演示了如何在NodeJS中创建创建mysql连接、mysql数据库、插入数据、查询数据等功能,需要的朋友可以参考下
    2014-12-12
  • nodejs如何获取时间戳与时间差

    nodejs如何获取时间戳与时间差

    本文详细介绍了nodejs获取时间戳与时间差的多种方法,对平时nodejs的使用很有帮助,下面一起来看看吧。
    2016-08-08
  • Nodejs对postgresql基本操作的封装方法

    Nodejs对postgresql基本操作的封装方法

    今天小编就为大家分享一篇Nodejs对postgresql基本操作的封装方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-02-02
  • 使用forever管理nodejs应用教程

    使用forever管理nodejs应用教程

    这篇文章主要介绍了使用forever管理nodejs应用教程,本文介绍了forever的安装、常用命令等,最有用的莫过于文件改动监听并自动重启了,这可以增加开nodejs应用的效率,需要的朋友可以参考下
    2014-06-06
  • node.js文件操作系统实例详解

    node.js文件操作系统实例详解

    这篇文章主要介绍了node.js文件操作,结合实例形式详细分析了node.js针对文件的读取、写入、删除、遍历、监控等各种常见操作技巧,需要的朋友可以参考下
    2019-11-11
  • 解决nodejs的npm命令无反应的问题

    解决nodejs的npm命令无反应的问题

    今天小编就为大家分享一篇解决nodejs的npm命令无反应的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • node.js中fs文件系统目录操作与文件信息操作

    node.js中fs文件系统目录操作与文件信息操作

    本篇文章给大家详细分析了node.js中fs文件系统目录操作与文件信息操作的方法以及代码详解,需要的读者可以参考下。
    2018-02-02
  • Node.js实现批量下载图片简单操作示例

    Node.js实现批量下载图片简单操作示例

    这篇文章主要介绍了Node.js实现批量下载图片简单操作,结合实例形式分析了node.js批量下载图片的具体步骤与相关实现技巧,需要的朋友可以参考下
    2020-01-01
  • 学习使用ExpressJS 4.0中的新Router的用法

    学习使用ExpressJS 4.0中的新Router的用法

    ExpressJS 4.0中提出了新的路由Router,提供了路由应有的API,本文详细的介绍了ExpressJS 4.0中的新Router的用法,非常具有实用价值,需要的朋友可以参考下
    2018-11-11
  • 通过Nodejs搭建网站简单实现注册登录流程

    通过Nodejs搭建网站简单实现注册登录流程

    这篇文章主要介绍了通过Nodejs搭建网站简单实现注册登录流程,Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。 Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。,需要的朋友可以参考下
    2019-06-06

最新评论