var http = require('http'),
iconv = require('iconv-lite'); http.get("http://website.com/", function(res) {
var body = '';
res.on('data', function(chunk) {
body += chunk;
});
res.on('end', function() {
var decodedBody = iconv.decode(body, 'win1252'); // 或者gbk/gb2312等
console.log(decodedBody);
});
});

在使用iconv.decode()解码之前,最初的资源已经通过body += chunk解码了,发生了什么:

res.on('data', function(chunkBuffer) {
body += chunkBuffer.toString('utf8');
});

如果你设置了res.setEncoding(‘utf8’);。那么和上面的转化是一样的。

对于最开始的问题,使用了两次解码(无论一次还是两次),都是错误的结果。几乎是不可能地回复最初的字节因为utf8转换是有损耗的(lossy)。所以即使是iconv.decode(new Buffer(body, 'utf8'), 'win1252')也无济于事。

注意: theoretically, if you use ‘binary’ encoding to first decode to strings, then feed them to decode, you get the correct results. This is a bad practice because it’s slower, it’s mixing concepts and ‘binary’ encoding is deprecated.
这段不是很懂什么意思,反正使用’binary’编码是不赞成的。(二进制编码?)

解决方案

保持开始的buffer并且使用iconv.decode,如果有必要,可以使用Buffer.concat()。

首先需要知道的是,在data事件的时候,所有的js字符串都是经过解码(utf8)的,我们就不需要手动解码了。

http.get("http://website.com/", function(res) {
var chunks = [];
res.on('data', function(chunk) {
chunks.push(chunk);
});
res.on('end', function() {
var decodedBody = iconv.decode(Buffer.concat(chunks), 'win1252');
console.log(decodedBody);
});
}); // Or, with iconv-lite@0.4 and Node v0.10+, you can use streaming support with `collect` helper
http.get("http://website.com/", function(res) {
res.pipe(iconv.decodeStream('win1252')).collect(function(err, decodedBody) {
console.log(decodedBody);
});
});

如果想要忽略警告:
iconv.skipDecodeWarning = true;

转自https://blog.csdn.net/real_bird/article/details/53309512

iconv.skipDecodeWarning = true;

 
 

iconv转码问题出现乱码问题 - 乐杨俊浅谈LAMP

2490

iconv转码问题 iconv("UTF-8","GB2312//IGNORE",$data) 来自: 乐杨俊浅谈LAMP

下载

nodejs iconv-lite模块 - newandlife

09-22

nodejs中用于各种字符集间高效的转码 nodejs中用于各种字符集间高效的转码 nodejs中用于各种字符集间高效的转码 nodejs中用于各种字符集间高效的转码 nodejs中用于各种字符集间高
no suited ad found
逍遥子_

关注 310篇文章

Hensen_

关注 182篇文章

后海hh

关注 109篇文章

 

node爬取html乱码的更多相关文章

  1. python(27)requests 爬取网页乱码,解决方法

    最近遇到爬取网页乱码的情况,找了好久找到了种解决的办法: html = requests.get(url,headers = head) html.apparent_encoding html.enc ...

  2. Node爬取简书首页文章

    Node爬取简书首页文章 博主刚学node,打算写个爬虫练练手,这次的爬虫目标是简书的首页文章 流程分析 使用superagent发送http请求到服务端,获取HTML文本 用cheerio解析获得的 ...

  3. 4k图片爬取+中文乱码

    4k图片爬取+中文乱码 此案例有三种乱码解决方法,推荐第一种 4k图片爬取其实和普通图片爬取的过程是没有本质区别的 import requests import os from lxml import ...

  4. 总结:从Node爬取数据到前端图表展示

    最近寒假在家学习Node.js开发,光看书或者跟着敲代码还不够,得找一点有趣的事情来玩一玩,于是我决定写一个Node爬虫,爬取一些有意思或者说是有用的数据.这个决定只与我的兴趣有关,与Python或者 ...

  5. 【Python成长之路】Python爬虫 --requests库爬取网站乱码(\xe4\xb8\xb0\xe5\xa)的解决方法【华为云分享】

    [写在前面] 在用requests库对自己的CSDN个人博客(https://blog.csdn.net/yuzipeng)进行爬取时,发现乱码报错(\xe4\xb8\xb0\xe5\xaf\x8c\ ...

  6. Node爬取网站数据

    npm安装cheerio和axios npm isntall cheerio npm install axios 利用cheerio抓取对应网站中的标签根据链接使用axios获取对应页面数据 cons ...

  7. node爬取页面元素

    /** * Created by on 2018/12/25. */const http = require("https");const fs = require('fs'); ...

  8. node 爬虫 --- 将爬取到的数据,保存到 mysql 数据库中

    步骤一:安装必要模块 (1)cheerio模块 ,一个类似jQuery的选择器模块,分析HTML利器. (2)request模块,让http请求变的更加简单 (3)mysql模块,node连接mysq ...

  9. node js 爬虫爬取静态页面,

    先打一个简单的通用框子 //根据爬取网页的协议 引入对应的协议, http||https var http = require('https'); //引入cheerio 简单点讲就是node中的jq ...

随机推荐

  1. js 实现论坛评论模块原理

    <body>   <table id="tb" border="1">   <tbody id="tbd"&g ...

  2. python之内置函数(二)与匿名函数、递归函数初识

    一.内置函数(二)1.和数据结构相关(24)列表和元祖(2)list:将一个可迭代对象转化成列表(如果是字典,默认将key作为列表的元素).tuple:将一个可迭代对象转化成元组(如果是字典,默认将k ...

  3. 清明培训 清北学堂 DAY2

    今天是钟皓曦老师的讲授~~ 总结了一下今天的内容: 数论!!! 1.整除性 2.质数 定义: 性质:  3.整数分解定理——算数基本定理 证明: 存在性: 设N是最小不满足唯一分解定理的整数 (1)  ...

  4. oneinstack 安装 https-certbot

    免费https?   官方安装教程:https://certbot.eff.org/#centos6-nginx (以下是说明安装时遇到的): 下载并修改文件权限 wget https://dl.ef ...

  5. Codeforces Beta Round #51 D. Beautiful numbers(数位dp)

    题目链接:https://codeforces.com/contest/55/problem/D 题目大意:给你一段区间[l,r],要求这段区间中可以整除自己每一位(除0意外)上的数字的整数个数,例如 ...

  6. Cucumber环境配置

    1.JDK下载和配置 2.Maven下载和环境配置 3.IDEA下载和Cucumber插件安装 下载地址官网,一般IDEA自带cucumber插件 如果没有安装过的话,点击以下进行搜索安装,安装完成后 ...

  7. EF CodeFirst系列(3)---EF中的继承策略(暂存)

    我们初始化数据库一节已经知道:EF为每一个具体的类生成了数据库的表.现在有了一个问题:我们在设计领域类时经常用到继承,这能让我们的代码更简洁且容易管理,在面向对象中有“has  a”和“is a”关系 ...

  8. [物理学与PDEs]第2章习题10 一维理想流体力学方程组的 Lagrange 形式

    试证明: 一维理想流体力学方程组的 Lagrange 形式 (5. 22)-(5. 24) 也可写成如下形式 $$\beex \bea \cfrac{\p \tau}{\p t}-\cfrac{\p ...

  9. npm cnpm yarn

    npm 如何下载指定版本的组件 先确保文件目录下含有 package.json 文件, 没有的话,可以通过 npm init 创建, 然后只需要在组件的后面加上 @2.8.1 版本号即可, 例如:re ...

  10. 运维工作笔记-------nginx的反向代理

    1.nginx的反向代理意义 一般来说,我们在项目中,不会直接让项目服务器ip与外网做直接映射,这样一则是不安全,二是客户直接去访问项目服务器,对项目服务器带来的压力太大,从而导致项目运行速度变慢,程 ...