如何使用lxml解析XML时保留转义字符不还原?
如何让lxml读取XML字符串时保留转义字符不还原
lxml作为遵循XML规范的解析库,默认会自动解析XML实体引用(比如&转成&、'转成'),所以你写的测试代码会失败——'会被逐层解析成'。
要保留原始的转义序列,核心思路是提前把字符串里的&转义成&,让解析器把转义后的'解析回',这样最终得到的文本就和原字符串一致了。
修改后的测试代码如下:
from lxml import etree def test_etree_parse(): test_str = "Text&apos;s escaped" # 转义字符串中的&,避免lxml解析原始实体 escaped_str = test_str.replace("&", "&") xml = etree.XML(f"<root>{escaped_str}</root>") assert xml.find(".").text == test_str # 现在测试会通过
原理很简单:原字符串里的&apos;会被替换成&amp;apos;,当lxml解析这个XML时,会先把&转成&,最终得到的文本就是Text&apos;s escaped,和你的test_str完全匹配。
如果是从外部文件读取XML内容,也可以先读取全部文本,执行相同的替换操作后再交给lxml解析。
内容的提问来源于stack exchange,提问作者Jack Deeth
相关产品推荐
相关产品推荐

