Node.js Cheerio 解析器破坏了 UTF-8 编码
Node.js Cheerio parser breaks UTF-8 encoding
我用 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;">Уличная 3Мп IP HD камера OMNY
目标urllink编码为UTF-8格式。那么为什么 Cheerio 会破坏我的编码?
正在尝试使用 iconv 对我的 body 响应进行编码:
var body1 = iconv.decode(body, "utf-8");
但 console.log($(".description").html());
仍然 returns 奇怪的文字。
Cheerio 没有损坏任何东西。它正在输出 HTML entities,这将由任何浏览器呈现,与 HTML 输入完全相同。 运行这个片段看看我的意思:
<h1><span style="font-size: 16px;">Уличная 3Мп IP HD камера OMNY - попробуйте найти лучше</span></h1>
<h1><span style="font-size: 16px;">Уличная 3Мп IP HD камера OMNY - попробуйте найти лучше</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>
我今天早些时候遇到了一个问题,当时我试图用 cheerio 加载一个页面,其中我们有特殊字符,如 ç
、á
、é
等...
cheerio 的工作方式是尝试自然地解码字符并呈现 Unicode 字符
的数字 HTML 编码
例如: 而不是 ç
它会给我们 ç
。
为了解决这个问题,我只需要通过添加以下内容来关闭此配置:decodeEntities: false
作为 cheerio 加载参数。
const $ = cheerio.load(body, { decodeEntities: false });
我用 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;">Уличная 3Мп IP HD камера OMNY
目标urllink编码为UTF-8格式。那么为什么 Cheerio 会破坏我的编码?
正在尝试使用 iconv 对我的 body 响应进行编码:
var body1 = iconv.decode(body, "utf-8");
但 console.log($(".description").html());
仍然 returns 奇怪的文字。
Cheerio 没有损坏任何东西。它正在输出 HTML entities,这将由任何浏览器呈现,与 HTML 输入完全相同。 运行这个片段看看我的意思:
<h1><span style="font-size: 16px;">Уличная 3Мп IP HD камера OMNY - попробуйте найти лучше</span></h1>
<h1><span style="font-size: 16px;">Уличная 3Мп IP HD камера OMNY - попробуйте найти лучше</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>
我今天早些时候遇到了一个问题,当时我试图用 cheerio 加载一个页面,其中我们有特殊字符,如 ç
、á
、é
等...
cheerio 的工作方式是尝试自然地解码字符并呈现 Unicode 字符
的数字 HTML 编码例如: 而不是 ç
它会给我们 ç
。
为了解决这个问题,我只需要通过添加以下内容来关闭此配置:decodeEntities: false
作为 cheerio 加载参数。
const $ = cheerio.load(body, { decodeEntities: false });