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

为何使用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 &gt; 85C : 10ms 85 =&gt; T &gt 30C : 100ms T &lt; 30 : 1s</dd>

parser.feed(et.tostring(element, encoding="utf-8"))

parser.close()

预期输出

print(et.tostring(target.body, encoding="utf-8")))
>>>    <body>T &gt; 85C : 10ms 85 =&gt; T &gt 30C : 100ms T &lt; 30 : 1s</body>

实际输出

print(et.tostring(target.body, encoding="utf-8")))
>>>    <body><p> T </p><p>&gt;</p><p> 85C : 10ms 85 =</p><p>&gt;</p><p> T </p><p>&gt</p><p> 30C : 100ms T </p><p>&lt;</p><p> 30 : 1s </p></body>

原因分析

核心问题出在解析目标target的类型:你使用的target是HTML相关的解析目标(比如HTMLTreeBuilderTarget),而非纯XML解析目标。

HTML解析器为兼容松散的HTML语法,会自动对零散文本节点做语义化补全——当文本被&gt;这类实体字符拆分时,会把每个文本片段单独包裹成<p>标签,这是HTML解析器的默认行为,而你用XMLPullParser搭配HTML target,就触发了这个逻辑。纯XML解析器不会自动添加这类标签,因为XML要求严格结构,不会随意补全语义化元素。

解决办法

  1. 改用纯XML解析目标:如果处理的是严格格式的XHTML/XML,初始化XMLPullParser时不要指定HTML相关的target,或明确使用XML解析的target。
  2. 直接提取文本内容:不需要通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 03:06:04