使用ElementTree从混合元素xml标记中获取文本

时间:2017-11-09 17:34:41

标签: python xml 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,我希望在文字标记中获取文字,但如果文字类型为non-ling则不是。

如果我遍历u的孩子,不知何故最后一个文本位总是丢失。我能够达到它的唯一方法是使用itertext()。但是,失去了检查声乐标签类型的机会。

我如何解析它以便得到这样的结果:

eh ¿Sí? 
Pues... A mí no me suena. 

1 个答案:

答案 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.