使用 ElementTree 从混合元素 xml 标签中获取文本
Get text from mixed element xml tags with ElementTree
我正在使用 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
,我想获取 vocal 标签中的文本,但如果它的类型是 non-ling
,我就不想获取它。
如果我遍历 u
的子项,最后的文本位总是丢失。我可以达到它的唯一方法是使用 itertext()
。但是这样就失去了检查声乐标签类型的机会。
我如何解析它才能得到这样的结果:
eh ¿Sí?
Pues... A mí no me suena.
丢失的文本位,“¿Sí?”和 "A mí no me 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.
我正在使用 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
,我想获取 vocal 标签中的文本,但如果它的类型是 non-ling
,我就不想获取它。
如果我遍历 u
的子项,最后的文本位总是丢失。我可以达到它的唯一方法是使用 itertext()
。但是这样就失去了检查声乐标签类型的机会。
我如何解析它才能得到这样的结果:
eh ¿Sí?
Pues... A mí no me suena.
丢失的文本位,“¿Sí?”和 "A mí no me 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.