Python解析器不将视为自闭合标签,而是解析为含空文本的双标签元素;真正的自闭合标签是;判断逻辑为空需手动检查text、tail和子元素数量。
的解析">
Python 中的 XML/HTML 解析器(如 xml.etree.ElementTree、lxml、BeautifulSoup)**不把 当作自闭合标签处理,而是当作普通开始+结束标签**,即包含一个空文本子节点的元素。真正的自闭合标签是像 这样的写法。
xml.etree.ElementTree 会把 解析为一个有开始和结束标签的普通元素,其 .text 为 None 或空字符串(取决于解析方式),但结构上仍是双标签。它不会自动合并或重写为 。
,解析后 elem.text 通常是 None(若标签间无空白)或 '\n '(若有缩进)elem.tag 是 'item',len(list(elem)) 是 0,表示无子元素not elem.text and not elem.tail and len(elem) == 0
xml 支持输出自闭合形式(可选)lxml.etree 在序列化时可通过 method='xml' 和 xml_declaration=True 输出标准 XML,并支持 selfclosing_tags 参数(仅限写入时控制格式):
etree.tostring(elem) 对空元素仍输出
,需在创建元素时用 etree.Element('tag', **{'/': ''})(不推荐)或使用 etree.tostring(..., method='xml', xml_declaration=False) 并配合 etree.XMLParser(remove_blank_text=True) 预处理BeautifulSoup(尤其搭配 html.parser 或 lxml 解析器)会把 和 都视为同一元素,且默认输出时倾向于用双标签形式。
soup.prettify(formatter=lambda s: s.strip() if s.strip() else '') 辅助,但无法直接强制所有空标签变 />
、
在解析时会被自动标准化为自闭合(取决于解析器和文档类型)大多数场景下,你不需要“修复”标签形式,而应关注内容逻辑。若必须统一为自闭合格式(如生成配置文件、对接严格 XML Schema):
not elem.text and not elem.tail and len(elem) == 0 and not elem.attrib 找出纯空元素lxml 的 etree.tostring() + 正则替换,或改用 xml.dom.minidom(支持 toxml() 中的 selfClosingTags 参数) 和 完全等价,除非下游系统有特殊要求,否则无需强求格式一致