只需要一个属性

时间:2017-11-02 23:48:31

标签: python regex xml parsing

我正在尝试解析xml文件,我只需要一个属性。有没有简单的方法来获得所述属性?

该文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE chunkList SYSTEM "ccl.dtd">
<chunkList>
 <chunk id="ch1" type="p">
  <sentence id="s1">
   <tok>
    <orth>testowy</orth>
    <lex disamb="1"><base>testowy</base><ctag>adj:sg:nom:m3:pos</ctag></lex>
    <prop key="sense:ukb:syns_id">1358</prop>
    <prop key="sense:ukb:syns_rank">1358/1.0000000000</prop>
    <prop key="sense:ukb:unitsstr">próbny.1(42:jak) testowy.1(42:jak)</prop>
   </tok>
   <tok>
    <orth>plik</orth>
    <lex disamb="1"><base>plik</base><ctag>subst:sg:nom:m3</ctag></lex>
    <prop key="sense:ukb:syns_id">35864</prop>
    <prop key="sense:ukb:syns_rank">35864/0.6075684112 2248/0.3924315888</prop>
    <prop key="sense:ukb:unitsstr">plik.2(7:por)</prop>
   </tok>
  </sentence>
 </chunk>
</chunkList>

它将具有可变数量的<tok>分支,并且每个<tok>分支可能具有不同数量的密钥。 我需要提取的唯一属性是syns_id。

它可能是一个巨大的xml文件,我想的几百兆字节。 或大约10万个小的,只有大约5-10 <tok>

我需要的是一个包含所有这些syns_id的列表。 我该怎么办呢?我认为正则表达式会解决它,但我还没有使用它们。或者有更快/更好的方式吗?

1 个答案:

答案 0 :(得分:1)

我不确切知道这是多么可扩展,但这在任何情况下都是我的第一次尝试:

import lxml.etree

et = lxml.etree.parse('big.xml')
et.xpath('//prop[@key="sense:ukb:syns_id"]/text()')

在您的样本上,这会产生:

['1358', '35864']

(虽然请注意字符串实际上是 lxml.etree._ElementUnicodeResult的实例,它是str

的子类