支持解析转义与非转义字符的XML Parser选型及lxml实现方案咨询
lxml原生实现方案
你遇到的问题是lxml默认行为导致的:text属性仅存储节点第一个子元素前的文本内容,且默认会自动解析XML实体。可以通过调整解析参数+手动拼接内容实现需求:
- 解析XML时添加
resolve_entities=False参数,禁止自动还原转义实体 - 手动拼接节点的
text、子节点完整内容、子节点tail文本,得到完整原始内容
示例代码:
from lxml import etree def get_node_inner_raw_content(element): content_parts = [element.text if element.text else ""] for child in element.iterchildren(): # 输出子节点完整字符串,包含尾部文本 content_parts.append(etree.tostring(child, encoding="unicode", with_tail=True)) return "".join(content_parts) # 初始化解析器,关闭实体解析 parser = etree.XMLParser(resolve_entities=False) root = etree.fromstring(你的XML字符串, parser=parser) title_element = root.find("title") result = get_node_inner_raw_content(title_element)
上述代码返回结果完全符合你的要求:
- 嵌套的
<i>标签会原样保留 - 转义实体
<不会被自动还原,保持原始输入形式
更简单的替代方案:使用BeautifulSoup
如果不需要lxml的复杂特性,用BeautifulSoup实现更便捷,内置的decode_contents()方法可以直接返回节点内部的原始内容:
示例代码:
from bs4 import BeautifulSoup # 初始化时指定XML解析器,关闭实体转换 soup = BeautifulSoup(你的XML字符串, "xml") title_element = soup.find("title") result = title_element.decode_contents()
该方法不需要手动拼接内容,默认即可保留节点内部所有原始输入,包括嵌套标签和未解析的转义实体。
内容的提问来源于stack exchange,提问作者Malvinka
相关产品推荐
相关产品推荐

