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

相关文章

  • nestjs搭建HTTP与WebSocket服务详细过程

    nestjs搭建HTTP与WebSocket服务详细过程

    这篇文章主要介绍了nestjs搭建HTTP与WebSocket服务详细过程的相关资料,需要的朋友可以参考下
    2022-11-11
  • node.js自动上传ftp的脚本分享

    node.js自动上传ftp的脚本分享

    这篇文章主要给大家介绍了一个关于node.js自动上传ftp脚本的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧
    2018-06-06
  • NodeJS 创建目录和文件的方法实例分析

    NodeJS 创建目录和文件的方法实例分析

    这篇文章主要介绍了NodeJS 创建目录和文件的方法,涉及node.js中fs模块mkdir、writeFile及目录判断existsSync等方法的功能与相关使用技巧,需要的朋友可以参考下
    2023-04-04
  • 浅析node.js中close事件

    浅析node.js中close事件

    本文简单介绍了http.ServerRespose对象的close事件,并给出了相关实例,推荐给需要的小伙伴参考下吧。
    2014-11-11
  • 轻松创建nodejs服务器(2):nodejs服务器的构成分析

    轻松创建nodejs服务器(2):nodejs服务器的构成分析

    这篇文章主要介绍了轻松创建nodejs服务器(2):nodejs服务器的构成分析,本文是对第一节中简单服务器的代码进行分析总结,需要的朋友可以参考下
    2014-12-12
  • Node.js API详解之 timer模块用法实例分析

    Node.js API详解之 timer模块用法实例分析

    这篇文章主要介绍了Node.js API详解之 timer模块用法,结合实例形式分析了Node.js API中timer模块基本功能、原理、用法及操作注意事项,需要的朋友可以参考下
    2020-05-05
  • node内存泄漏排查与修复过程

    node内存泄漏排查与修复过程

    之前开发了一个node接口,该接口使用canvas绘制产品图提供给java端使用,在运行了一段时间后发现了内存泄漏问题,本文浅记下修复过程,文章通过图文介绍的非常详细,需要的朋友可以参考下
    2024-06-06
  • Node.js 去掉种子(torrent)文件里的邪恶信息

    Node.js 去掉种子(torrent)文件里的邪恶信息

    torrent文件,又被称为种子,原来只是用于记录 bt下载当中所需信息的一种文件。但是随着互联网的极大发展,一些人士将一些邪恶的信息注入到了小小的 torrent文件当中,种子从此变成了邪恶的代名词。
    2015-03-03
  • node.js中的http.response.write方法使用说明

    node.js中的http.response.write方法使用说明

    这篇文章主要介绍了node.js中的http.response.write方法使用说明,本文介绍了http.response.write的方法说明、语法、接收参数、使用实例和实现源码,需要的朋友可以参考下
    2014-12-12
  • Node.js API详解之 vm模块用法实例分析

    Node.js API详解之 vm模块用法实例分析

    这篇文章主要介绍了Node.js API详解之 vm模块用法,结合实例形式分析了Node.js API中vm模块基本功能、函数、使用方法及相关操作注意事项,需要的朋友可以参考下
    2020-05-05

最新评论