Node.js Cheerio 解析器破坏了 UTF-8 编码

标签 node.js encoding cheerio

我用 Cheerio 解析我的请求,如下所示:

var url = http://shop.nag.ru/catalog/16939.IP-videonablyudenie-OMNY/16944.IP-kamery-OMNY-c-vario-obektivom/16704.OMNY-1000-PRO;
request.get(url, function (err, response, body) {
  console.log(body);
   $ = cheerio.load(body);
   console.log($(".description").html());
});

作为输出,我看到了内容,但使用了不可读的奇怪编码:

//Plain body console.log(body) (p.s. russian chars): 
<h1><span style="font-size: 16px;">Уличная 3Мп IP HD камера OMNY - попробуйте найти лучше</span></h1><p style

//  cheerio's console.log $(".description").html()
<h1><span style="font-size: 16px;">&#x423;&#x43B;&#x438;&#x447;&#x43D;&#x430;&#x44F; 3&#x41C;&#x43F; IP HD &#x43A;&#x430;&#x43C;&#x435;&#x440;&#x430; OMNY

目标网址链接编码为 UTF-8 格式。那么为什么 Cheerio 会破坏我的编码呢?

尝试使用 iconv 来编码我的 body react :

var body1 = iconv.decode(body, "utf-8");

但是 console.log($(".description").html()); 仍然返回奇怪的文本。

最佳答案

Cheerio 没有破坏任何东西。它正在输出 HTML entities ,它将被任何浏览器呈现与 HTML 输入完全相同。运行此代码段以了解我的意思:

<h1><span style="font-size: 16px;">Уличная 3Мп IP HD камера OMNY - попробуйте найти лучше</span></h1>

<h1><span style="font-size: 16px;">&#x423;&#x43B;&#x438;&#x447;&#x43D;&#x430;&#x44F; 3&#x41C;&#x43F; IP HD &#x43A;&#x430;&#x43C;&#x435;&#x440;&#x430; OMNY - &#x43F;&#x43E;&#x43F;&#x440;&#x43E;&#x431;&#x443;&#x439;&#x442;&#x435; &#x43D;&#x430;&#x439;&#x442;&#x438; &#x43B;&#x443;&#x447;&#x448;&#x435;</span></h1>

例如,

У 是将字符 У 编码为 HTML 实体,与实体 > 的方式相同代表>

但是,如果要获取未编码的文本,可以将 decodeEntities 选项设置为 false:

const $ = cheerio.load(
  `<h1><span style="font-size: 16px;">Уличная 3Мп IP HD камера OMNY - попробуйте найти лучше</span></h1>`,
  { decodeEntities: false }
);


console.log($('span').html())
// => Уличная 3Мп IP HD камера OMNY - попробуйте найти лучше
.as-console-wrapper{min-height:100%}
<script src="https://bundle.run/cheerio@1.0.0-rc.3"></script>

关于Node.js Cheerio 解析器破坏了 UTF-8 编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31574127/

相关文章:

python - 将 ☺ 编码为 IBM-437 失败,而 é 等其他有效字符成功

php - 将 HTML 实体放入 MySQL 数据库时对其进行解码

jquery - 使用cheerio在没有 child 的 parent 中获取文本

javascript - Typescript - 有没有办法指定全局引用?

encoding - 是否可以将万事达卡虚拟借记卡编码为物理卡?

javascript - 使用 Cheerio Node 查找选项中的特定值

javascript - 如何在 Node.js 服务器上加载图像?

javascript - 删除 Google 闭包编译器对缩小 js 的警告

javascript - Node JS Jasmine 使用 jasmine.any() 测试多种类型

node.js - 从socket.on()内部调用外部函数