【问题标题】:Get text from mixed element xml tags with ElementTree使用 ElementTree 从混合元素 xml 标记中获取文本
【发布时间】:2017-11-09 17:34:40
【问题描述】:

我正在使用 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. 

【问题讨论】:

  • 您必须“手动”迭代所有子节点和文本节点(即不使用itertext())并过滤掉不需要的内容。或者,您可以使用简单的 XSLT 转换对 XML 进行预处理,以删除您不想要的子树。
  • 当我手动迭代时,最后一个文本位总是丢失。
  • 显示您用于手动迭代的代码。可能是递归的,你还记得在递归调用后继续迭代以捕获后面的文本节点吗?
  • for t in u_element.iter(): print(t.text) -> 这只会在第一个 u 元素中打印“eh”,在第二个 u 元素中打印“Pues...laugh”。不知道我知道该怎么做。

标签: python xml elementtree


【解决方案1】:

丢失的文本位,“¿Sí?”和“A mí no me suena.”,可作为每个 &lt;vocal&gt; 元素(元素结束标记之后的文本)的 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.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-06
    • 1970-01-01
    • 1970-01-01
    • 2016-01-10
    • 1970-01-01
    • 2018-04-12
    • 2014-11-29
    • 1970-01-01
    相关资源
    最近更新 更多