穿越TEI在Python 3,短信来了空的一些实体
问题描述:
我有实体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标签)获取元素文本,但我宁愿了解这里发生了什么。感谢您的任何帮助,您可以提供。
答
这是因为在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)