1

我如何阅读<context>...</context>标签中的所有文本?那么<head>...<\head>标签内的<context \>标签呢?

我有一个如下所示的 XML 文件:

<corpus lang="english">
    <lexelt item="coach.n">
        <instance id="1">
            <context>I'll buy a train or <head>coach</head> ticket.</context>
        </instance>
        <instance id="2">
            <context>A branch line train took us to Aubagne where a <head>coach</head> picked us up for the journey up to the camp.</context>
        </instance>
    </lexelt>
</corpus>

但是当我运行我的代码来读取...中的 XML 文本时,我只会在到达标签之前获取文本。

import xml.etree.ElementTree as et    
inputfile = "./coach.data"    
root = et.parse(open(inputfile)).getroot()
instances = []

for corpus in root:
    for lexelt in corpus:
      for instance in lexelt:
        instances.append(instance.text)

j=1
for i in instances:
    print "instance " + j
    print "left: " + i
    print "\n"  
    j+=1

现在我只是在左边:

instance 1
left: I'll buy a train or 

instance 2
left: A branch line train took us to Aubagne where a 

输出还需要上下文和头部的右侧,它应该是:

instance 1
left: I'll buy a train or 
head: coach
right:   ticket.

instance 2
left: A branch line train took us to Aubagne where a 
head: coach
right:  picked us up for the journey up to the camp.
4

2 回答 2

3

首先,您的代码有错误。for corpus in root没必要,你的 root 已经是corpus.

你可能打算做的是:

for lexelt in root:
  for instance in lexelt:
    for context in instance:
      contexts.append(context.text)

现在,关于您的问题 - 在for context in instance块内,您可以访问您需要的其他两个字符串:

  1. head文本可以通过访问来访问context.find('head').text
  2. head可以通过访问context.find('head').tail 根据Python etree docs来读取元素右侧的文本:

tail属性可用于保存与元素关联的附加数据。该属性通常是一个字符串,但也可以是任何特定于应用程序的对象。如果元素是从 XML 文件创建的,则该属性将包含在元素的结束标记之后和下一个标记之前找到的任何文本。

于 2012-09-22T07:34:00.120 回答
1

在 ElementTree 中,您将不得不考虑子节点的 tail 属性。在您的情况下,语料库也是根。

    导入 xml.etree.ElementTree 作为 et    
    输入文件 = "./coach.data"    
    corpus = et.parse(open(inputfile)).getroot()

    def getalltext(elem):
        return elem.text + ''.join([getalltext(child) + child.tail for child in elem])

    实例 = []
    对于语料库中的 lexelt:
        例如在 lexelt 中:
            instance.append(getalltext(instance))


    j=1
    对于 i 在实例中:
        打印“实例”+ j
        打印“左:” + i
        打印“\n”  
        j+=1

于 2012-09-22T08:04:47.587 回答