2016-05-06 52 views
1

我有实体TEI编码的XML文件,如下所示:穿越TEI在Python 3,短信来了空的一些实体

<sp> 
    <speaker rend="italic">Sampson.</speaker> 
    <ab> 
     <lb n="5"/> 
     <hi rend="italic">Gregory:</hi> 
     <seg type="homograph">A</seg> my word wee'l not carry coales.<lb n="6"/> 
    </ab> 
</sp> 
<sp> 
    <speaker rend="italic">Greg.</speaker> 
    <ab>No, for then we should be Colliars. 
     <lb n="7" rend="rj"/> 
    </ab> 
</sp> 

完整文件是非常大的,但可以在这里进行访问:http://ota.ox.ac.uk/desc/5721。我试图使用Python 3来遍历xml并获取与标签关联的所有文本,这是对话的地方。

import xml.etree.ElementTree as etree 
tree = etree.parse('romeo_juliet_5721.xml') 
doc = tree.getroot() 
for i in doc.iter(tag='{http://www.tei-c.org/ns/1.0}ab'): 
     print(i.tag, i.text) 
>>> http://www.tei-c.org/ns/1.0}ab 
>>>     
>>> {http://www.tei-c.org/ns/1.0}ab No, for then we should be Colliars. 

输出捕获的实体很好,但不承认“我的词wee'l不带coales”作为第一个ab的文本。如果它在一个不同的元素内,我没有看到它。我曾想过将整个元素转换为字符串,并使用正则表达式(或通过剥离所有xml标签)获取元素文本,但我宁愿了解这里发生了什么。感谢您的任何帮助,您可以提供。

回答

2

这是因为在ElementTree模型中,文字“我的词没有携带coales。”被认为是tail<seg>元件而不是text<ab>。要获得元素的文本以及其子元素的尾部,可以尝试以下方法:

for i in doc.iter(tag='{http://www.tei-c.org/ns/1.0}ab'): 
    innerText = i.text+''.join((text.tail or '') for text in i.iter()).strip() 
    print(i.tag, innerText)