如何配置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
相关产品推荐
相关产品推荐

