在Python中处理XML文本时,lxml库的etree.fromstring函数可以直接将字符串转换为Element对象。但在面对不规范XML、需要忽略空白或指定编码等场景时,就必须通过parser参数传入自定义的解析器。下面说明具体做法。

创建自定义解析器
lxml提供了etree.XMLParser类,我们可以在实例化时传入多个参数来控制解析行为,例如remove_blank_text用于去除空白文本节点,encoding指定编码,recover允许解析残缺XML。
from lxml import etree
# 创建解析器:去除空白、允许恢复残缺XML、指定编码
parser = etree.XMLParser(
remove_blank_text=True,
recover=True,
encoding='utf-8'
)
xml_text = '<root><item>测试</item></root>'
root = etree.fromstring(xml_text, parser=parser)
print(root.tag)
print(root.find('item').text)
常用parser参数说明
下面列出几个在etree.fromstring中经常用到的解析器参数及其作用:
| 参数名 | 类型 | 说明 |
|---|---|---|
| remove_blank_text | bool | 为True时删除只含空白的文本节点 |
| recover | bool | 为True时尝试恢复并解析不规范的XML |
| encoding | str | 指定输入字节串的编码格式 |
| no_network | bool | 为True时禁止解析器访问网络资源 |
解析字节串与字符串的区别
当传入bytes类型且带有XML声明时,parser中的encoding可能被声明覆盖;传入str类型时,lxml会先编码为UTF-8再解析。使用etree.fromstring时明确传入parser可避免环境差异导致的报错。
xml_bytes = b'<?xml version="1.0" encoding="gbk"?><r>中文</r>' # 指定parser以正确解析gbk声明 p = etree.XMLParser(recover=True) ele = etree.fromstring(xml_bytes, parser=p) print(ele.text)
小结
通过etree.XMLParser构造解析器并传给etree.fromstring的parser参数,可以精准控制XML解析过程。无论是清理空白、兼容破损数据,还是限制网络访问,都能在解析层统一处理,提升代码健壮性。
Pythonlxmletree_fromstringparserXML解析修改时间:2026-07-25 05:30:15