You need to enable JavaScript to run this app. 支持解析转义与非转义字符的XML Parser选型及lxml实现方案咨询
优惠活动
大模型
产品
解决方案
定价
更多

支持解析转义与非转义字符的XML Parser选型及lxml实现方案咨询

lxml原生实现方案

你遇到的问题是lxml默认行为导致的:text属性仅存储节点第一个子元素前的文本内容,且默认会自动解析XML实体。可以通过调整解析参数+手动拼接内容实现需求:

  1. 解析XML时添加resolve_entities=False参数,禁止自动还原转义实体
  2. 手动拼接节点的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>标签会原样保留
  • 转义实体&lt;不会被自动还原,保持原始输入形式

更简单的替代方案:使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 18:15:03