【问题标题】:Node.js Cheerio parser breaks UTF-8 encodingNode.js Cheerio 解析器破坏了 UTF-8 编码
【发布时间】:2015-07-22 21:16:15
【问题描述】:

我用 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 来编码我的身体反应:

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

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

【问题讨论】:

标签: node.js encoding cheerio


【解决方案1】:

Cheerio 没有破坏任何东西。它正在输出HTML entities,它将被任何浏览器呈现,与 HTML 输入完全相同。运行这个 sn-p 看看我的意思:

<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>

例如,&amp;#x423; 是编码为 HTML 实体的字符 У,与实体 &amp;gt; 表示 &gt; 的方式相同。

不过,如果要获取未编码的文本,可以将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%}
&lt;script src="https://bundle.run/cheerio@1.0.0-rc.3"&gt;&lt;/script&gt;

【讨论】:

  • 这也避免了第一个  char 添加到 Cheerio 输出中,谢谢。
  • 谢谢!您的解决方案也适用于 gulp-cheerio。我刚刚使用了这样的选项: gulp.src("./mysrc") .pipe(cheerio({ run: function ($, file) { // do something here... }, parserOptions: { xmlMode:真,解码实体:假}}))
【解决方案2】:

今天早些时候,当我尝试用cheerio 加载一个页面时遇到了一个问题,其中我们有çáé 等特殊字符...

cheerio 的工作方式是尝试自然解码字符并呈现 Unicode 字符的数字 HTML 编码

例如:而不是ç,它会给我们&amp;#xE7;

为了解决这个问题,我只需要通过添加:decodeEntities: false 作为cheerio 加载参数来关闭此配置。

const $ = cheerio.load(body, { decodeEntities: false });

【讨论】:

    猜你喜欢
    • 2012-11-07
    • 2014-06-30
    • 2023-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    • 2017-03-25
    • 1970-01-01
    相关资源
    最近更新 更多