如何在Windows下使用lxml解析XML时保留属性值中的换行符?
如何在Windows系统中用lxml解析XML时保留属性值里的换行符?
问题场景
在Windows系统使用lxml解析XML文档时,属性值中的换行符(\n)会被自动替换成空格,但相同代码在Linux系统下能正常保留换行符。
测试解析代码如下:
from lxml import etree root = etree.fromstring('<root attr1="line1\nline2"/>') print(etree.tostring(root).decode())
Windows下输出结果:
<root attr1="line1 line2"/>
而创建XML时,lxml会自动将换行符转义为 并保留:
from lxml import etree root = etree.Element('root', attr1='line1\nline2') print(root.attrib['attr1']) print(etree.tostring(root).decode())
输出结果:
line1 line2 <root attr1="line1 line2"/>
解决方案
通过创建XMLParser并关闭属性归一化(attribute_normalization=False),即可在Windows系统中禁用换行符转空格的行为。
修改后的解析代码:
from lxml import etree # 创建解析器并关闭属性归一化 parser = etree.XMLParser(attribute_normalization=False) root = etree.fromstring('<root attr1="line1\nline2"/>', parser=parser) print(etree.tostring(root).decode())
此时Windows下的输出结果会保留换行符:
<root attr1="line1 line2"/>
同时直接访问属性值也能拿到原始的换行符:
print(root.attrib['attr1']) # 输出: # line1 # line2
原理说明
lxml默认开启的attribute_normalization会按照XML规范对属性值中的空白字符(换行、制表符、连续空格等)进行归一化处理,将其替换为单个空格。在Windows系统中这个行为表现更显著,关闭该选项后,解析器会保留属性值中的原始空白字符,包括换行符。
内容的提问来源于stack exchange,提问作者privod
相关产品推荐
相关产品推荐

