You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置Cheerio使其不生成自闭合标签?

问题描述

运行以下Cheerio代码:

<div id="some"></div>

返回结果为自闭合标签:

<div id="some"/>

尝试过配置{ decodeEntities: false, xmlMode: true, recognizeSelfClosing: false }但无效果,需要修改这种自闭合行为。

相关代码示例:

import "./styles.css";
import { CheerioAPI, load } from "cheerio";

console.clear();

const doc = load(
  `
  <div id="some"></div>
`,
  { decodeEntities: false, xmlMode: true, recognizeSelfClosing: false },
  false
);

console.log({
  after: doc.html({
    decodeEntities: false,
    xmlMode: true,
    recognizeSelfClosing: false
  })
});
解决方案

核心问题在于开启xmlMode时,Cheerio会遵循XML规则将空元素转为自闭合标签,而<div>在HTML中属于非自闭合元素,因此需要调整配置切换到HTML模式:

  • 加载和输出时都关闭xmlMode:
    修改代码中的配置,去掉xmlMode: true,让Cheerio以HTML规则处理元素:

    import "./styles.css";
    import { CheerioAPI, load } from "cheerio";
    
    console.clear();
    
    const doc = load(
      `
      <div id="some"></div>
    `,
      { decodeEntities: false, recognizeSelfClosing: false },
      false
    );
    
    console.log({
      after: doc.html({
        decodeEntities: false,
        recognizeSelfClosing: false
      })
    });
    

    这样输出会保留<div id="some"></div>的完整闭合形式。

  • 若需保留XML模式加载,输出时切换为HTML模式:
    若加载阶段必须用XML模式,可在调用html()方法时关闭xmlMode:

    console.log({
      after: doc.html({
        decodeEntities: false,
        xmlMode: false,
        recognizeSelfClosing: false
      })
    });
    

原理:Cheerio在XML模式下会统一处理空元素为自闭合,而HTML模式会区分自闭合元素(如<img>、<br>)和非自闭合元素(如<div>、<p>),非自闭合元素即使为空也会保留完整的开始和结束标签。

内容的提问来源于stack exchange,提问作者Jon Sud

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 11:10:24