我使用ElementTree来解析我拥有的XML文档。我从u
标签中获取文字。其中一些内容混合了我需要过滤掉或保留为文本的内容。我有两个例子:
<u>
<vocal type="filler">
<desc>eh</desc>
</vocal>¿Sí?
</u>
<u>Pues...
<vocal type="non-ling">
<desc>laugh</desc>
</vocal>A mí no me suena.
</u>
如果文字类型为filler
,我希望在文字标记中获取文字,但如果文字类型为non-ling
则不是。
如果我遍历u
的孩子,不知何故最后一个文本位总是丢失。我能够达到它的唯一方法是使用itertext()
。但是,失去了检查声乐标签类型的机会。
我如何解析它以便得到这样的结果:
eh ¿Sí?
Pues... A mí no me suena.
答案 0 :(得分:0)
丢失的文字位,“¿Sí?”并且“Amínome suena。”,可用作每个<vocal>
元素的tail
属性(元素结束标记后面的文本)。
这是获取所需输出的方法(使用Python 2.7测试)。
假设vocal.xml如下所示:
<root>
<u>
<vocal type="filler">
<desc>eh</desc>
</vocal>¿Sí?
</u>
<u>Pues...
<vocal type="non-ling">
<desc>laugh</desc>
</vocal>A mí no me suena.
</u>
</root>
代码:
from xml.etree import ElementTree as ET
root = ET.parse("vocal.xml")
for u in root.findall(".//u"):
v = u.find("vocal")
if v.get("type") == "filler":
frags = [u.text, v.findtext("desc"), v.tail]
else:
frags = [u.text, v.tail]
print " ".join(t.encode("utf-8").strip() for t in frags).strip()
输出:
eh ¿Sí?
Pues... A mí no me suena.