【问题标题】:parsing XML using cElementTree in python在 python 中使用 cElementTree 解析 XML
【发布时间】:2017-11-11 16:28:45
【问题描述】:

我在使用 python 解析 XML 文件时遇到问题,即 - 语法。

我的 XML 文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE chunkList SYSTEM "ccl.dtd">
<chunkList>
 <chunk id="ch1" type="p">
  <sentence id="s1">
   <tok>
    <orth>dzisiaj</orth>
    <lex disamb="1"><base>dzisiaj</base><ctag>adv:pos</ctag></lex>
   </tok>
   <tok>
    <orth>uczę</orth>
    <lex disamb="1"><base>uczyć</base><ctag>fin:sg:pri:imperf</ctag></lex>
    <prop key="sense:ukb:syns_id">1449</prop>
    <prop key="sense:ukb:syns_rank">1449/0.3151019143 52662/0.2635524432 58124/0.2227816629 58122/0.1985639796</prop>
    <prop key="sense:ukb:unitsstr">szkolić.1(29:cumy) nauczać.1(29:cumy) kształcić.1(29:cumy) edukować.1(29:cumy) uczyć.1(29:cumy)</prop>
   </tok>
   <tok>
    <orth>się</orth>
    <lex disamb="1"><base>się</base><ctag>qub</ctag></lex>
   </tok>
   <tok>
    <orth>o</orth>
    <lex disamb="1"><base>o</base><ctag>prep:acc</ctag></lex>
   </tok>
   <tok>
    <orth>świecie</orth>
    <lex disamb="1"><base>świat</base><ctag>subst:sg:loc:m3</ctag></lex>
    <prop key="sense:ukb:syns_id">7826</prop>
    <prop key="sense:ukb:syns_rank">7826/0.1761356163 43462/0.1512730526 8139/0.1506959982 8361/0.1446884158 3331/0.1435643398 10819/0.1251661757 3332/0.1084764017</prop>
    <prop key="sense:ukb:unitsstr">cywilizacja.1(11:grp) krąg_kulturowy.1(11:grp) kultura.3(11:grp) krąg_cywilizacyjny.1(17:rsl) świat.2(11:grp)</prop>
   </tok>
  </sentence>
 </chunk>
</chunkList>

我需要的是一个包含两个值的元组的列表,&lt;orth&gt;&lt;prop key="sense:ukb:syns_id"&gt;。每个元组都对应每个&lt;tok&gt; 标签。所以,例如第二个&lt;tok&gt; 我需要像(uczę, 1449) 这样的结果。

我已经编写了关于我认为它应该如何工作的伪代码,但我不知道如何使用 ET 来实现它。

这里是:

ResultArray=[]

def treeSearch(root):
    for element in root:
        if element == 'tok':
            temp1=0
            temp2=0
            for tokens in element:
                if token == 'orth':
                    temp1=token.value()
                if token == 'prop key="sense:ukb:syns_id"':
                    temp2=token.value()
            tempTuple=(temp1,temp2)
            resultArray.append(tempTuple)

    return ResultArray

【问题讨论】:

  • 所以您只想捕获&lt;tok&gt; 标签内的第一个标签&lt;prop&gt;
  • 我想在每个&lt;tok&gt; 中捕获&lt;orth&gt;&lt;prop key="sense:ukb:syns_id"&gt; 并将其保存为一个元组。
  • &lt;orth&gt; 一直都在,但是如果没有&lt;prop key=...&gt;,我就可以用0。

标签: python xml parsing xml-parsing elementtree


【解决方案1】:

使用xml.etree.ElementTree 模块:

import xml.etree.ElementTree as ET

root = ET.parse('input.xml').getroot()
result = []
for tok in root.findall('.//tok'):
    result.append((tok.findtext('orth'), tok.findtext('prop[@key="sense:ukb:syns_id"]') or 0))

print(result)

输出:

[('dzisiaj', 0), ('uczę', '1449'), ('się', 0), ('o', 0), ('świecie', '7826')]

详情:

  • for tok in root.findall('.//tok'): - 遍历所有 &lt;tok&gt; 标签
  • tok.findtext('orth') - 将使用当前处理的&lt;tok&gt; 标签获取&lt;orth&gt; 标签的文本内容
  • tok.findtext('prop[@key="sense:ukb:syns_id"]') or 0 - 获取具有指定key 属性的&lt;prop&gt; 标记的文本内容。如果它不存在 - 将值保留为零 0

【讨论】:

  • 我已经尝试了好几个小时来完成这项工作,结果确实如此。上帝保佑你先生。你愿意解释一下吗?
  • @AwangardowyKaloryfer,不客气。查看我的详细信息
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-18
  • 2015-08-14
  • 2017-09-22
  • 2022-01-18
相关资源
最近更新 更多