为何使用Python lxml解析XHTML文件时会自动插入<p>标签?
lxml解析XHTML时自动生成多余
标签的问题分析
问题场景
刚接触HTML/XML技术,用Python的lxml库解析XHTML文件,目标是将解析结果导入DITA(XML)文件,但输出中出现了原本不存在的多个
标签,原文本被拆分成多个
包裹的片段。
相关代码及输出
代码片段
from lxml import etree as et parser = et.XMLPullParser(target=target) print(et.tostring(element, encoding="utf-8")) >>> <dd> T > 85C : 10ms 85 => T > 30C : 100ms T < 30 : 1s</dd> parser.feed(et.tostring(element, encoding="utf-8")) parser.close()
预期输出
print(et.tostring(target.body, encoding="utf-8"))) >>> <body>T > 85C : 10ms 85 => T > 30C : 100ms T < 30 : 1s</body>
实际输出
print(et.tostring(target.body, encoding="utf-8"))) >>> <body><p> T </p><p>></p><p> 85C : 10ms 85 =</p><p>></p><p> T </p><p>></p><p> 30C : 100ms T </p><p><</p><p> 30 : 1s </p></body>
原因分析
核心问题出在解析目标target的类型:你使用的target是HTML相关的解析目标(比如HTMLTreeBuilderTarget),而非纯XML解析目标。
HTML解析器为兼容松散的HTML语法,会自动对零散文本节点做语义化补全——当文本被>这类实体字符拆分时,会把每个文本片段单独包裹成<p>标签,这是HTML解析器的默认行为,而你用XMLPullParser搭配HTML target,就触发了这个逻辑。纯XML解析器不会自动添加这类标签,因为XML要求严格结构,不会随意补全语义化元素。
解决办法
- 改用纯XML解析目标:如果处理的是严格格式的XHTML/XML,初始化
XMLPullParser时不要指定HTML相关的target,或明确使用XML解析的target。 - 直接提取文本内容:不需要通过
parser.feed()重新解析字符串,直接从原<dd>元素提取纯文本,再插入到DITA的<body>中:# 提取<dd>的纯文本 dd_text = element.text # 或用et.tostring提取文本内容 dd_text = et.tostring(element, method="text", encoding="utf-8").decode("utf-8") # 创建DITA的body元素并插入文本 body = et.Element("body") body.text = dd_text print(et.tostring(body, encoding="utf-8"))
内容的提问来源于stack exchange,提问作者ahzired
相关产品推荐
相关产品推荐

