lxml.etree fromsting() 和 tostring() 不返回相同的数据

2024-05-30

我正在学习 lxml (在使用 ElementTree 之后),我很困惑为什么 .fromstring 和 .tostring 似乎不可逆。这是我的例子:

import lxml.etree as ET
f = open('somefile.xml','r')
data = f.read()
tree_in = ET.fromstring(data)
tree_out = ET.tostring(tree_in)
f2 = open('samefile.xml','w')
f2.write(tree_out)
f2.close

“somefile.xml”为 132 KB。 “samefile.xml”(输出)为 113 KB,并且在某个任意点缺少文件末尾。整个树的结束标签和最终元素的一些部分都消失了。

我的代码是否有问题,或者原始 XML 文件中的嵌套是否有问题?如果是这样,我是否被迫再次使用ElementTree的BeautifulSoup(没有xpath)?

需要注意的是:许多元素内的文本有一堆转换为文本的垃圾,但这就是导致此问题的原因吗?

Example:

<QuestionIndex Id="Perm"><Answer><![CDATA[confirm]]></Answer><Answer><![CDATA[NotConfirm]]></Answer></QuestionIndex>
<QuestionIndex Id="Actor"><Answer><![CDATA[GirlLt16]]></Answer><Answer><![CDATA[Fem17to25]]></Answer><Answer><![CDATA[BoyLt16]]></Answer><Answer><![CDATA[Mal17to25]]></Answer><Answer><![CDATA[Moth]]></Answer><Answer><![CDATA[Fath]]></Answer><Answer><![CDATA[Elder]]></Answer><Answer><![CDATA[RelLead]]></Answer><Answer><![CDATA[Auth]]></Answer><Answer><![CDATA[Teach]]></Answer><Answer><![CDATA[Oth]]></Answer></QuestionIndex>

如果没有完整的可重现示例,“在任意点丢失文件末尾”问题很难解释。

但我怀疑你所说的“一堆废话”是CDATA 部分 http://en.wikipedia.org/wiki/CDATA#CDATA_sections_in_XML。您的示例中有几个这样的内容(顺便说一句,这不是一个格式良好的 XML 文档)。

一般来说,XML 解析器没有义务完整保留 CDATA 部分。标记如

<Answer><![CDATA[confirm]]></Answer>

相当于

<Answer>confirm</Answer>    

但是,那lxml.etree.XMLParser http://lxml.de/api/lxml.etree.XMLParser-class.html课程需要一个strip_cdata可用于保留 CDATA 部分的参数。解析器的实例可以传递给etree.fromstring()。这是一个例子:

from lxml import etree 

XML = '<QuestionIndex Id="Perm"><Answer><![CDATA[confirm]]></Answer></QuestionIndex>'

print "Original size:", len(XML)
tree1 = etree.fromstring(XML)

out = etree.tostring(tree1)
print "With CDATA stripped:", len(out)
print out

parser = etree.XMLParser(strip_cdata=False)
tree2 = etree.fromstring(XML, parser)

out = etree.tostring(tree2)
print "With CDATA kept:", len(out)
print out

=>

Original size: 77
With CDATA stripped: 65
<QuestionIndex Id="Perm"><Answer>confirm</Answer></QuestionIndex>
With CDATA kept: 77
<QuestionIndex Id="Perm"><Answer><![CDATA[confirm]]></Answer></QuestionIndex>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

lxml.etree fromsting() 和 tostring() 不返回相同的数据 的相关文章

随机推荐