2016-05-06 31 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)