xml elementtree缺少元素python

时间:2015-02-14 06:37:08

标签: xml python-3.x

我一直在尝试解析xml文件(JMdict_e.xml)以进行翻译。但是,解析整个文件会返回一个不完整的数据集。

代码:

tree2 = ET.ElementTree(file = "JMdict_e.xml")
root2 = tree2.getroot()

print([i.tag for i in root2[55711]])
print([i.text for i in root2[55711][4]])

返回以下条目:

结果:

['ent_seq', 'k_ele', 'r_ele', 'r_ele', 'sense']
["Godan verb with `ru' ending", 'intransitive verb', 'to become less     capable', 'to grow dull', 'to become blunt', 'to weaken']

相反,当从原始xml数据库中提取单个条目时,将获得以下内容:

代码:

import xml.etree.cElementTree as ET

tree = ET.ElementTree(file = "new.xml")
root = tree.getroot()
print([i.tag for i in root[1]])
for i in root[1]:
    print([j.text for j in i if i.tag == "sense"])

结果:

['ent_seq', 'k_ele', 'r_ele', 'r_ele', 'sense', 'sense', 'sense', 'sense', 'sense']
##Truncated empty lists
['にぶい', 'adjective (keiyoushi)', 'dull (e.g. a knife)', 'blunt']
['のろい is usu. in kana', 'thickheaded', 'obtuse', 'stupid']
['にぶい', 'dull (sound, color, etc.)', 'dim (light)']
['slow', 'sluggish', 'inert', 'lethargic']
['のろい', 'indulgent (esp. to the opposite sex)', 'doting']

我一直在分离数据一段时间,但无法确定原因,但怀疑xml文件中的另一个条目可能会覆盖显示的内容。

XML片段

<JMdict>
<entry>
<ent_seq>1000000</ent_seq>
<r_ele>
<reb>ヽ</reb>
</r_ele>
<r_ele>
<reb>くりかえし</reb>
</r_ele>
<sense>
<pos>&n;</pos>
<gloss>repetition mark in katakana</gloss>
</sense>
</entry>
<entry>
<ent_seq>1582430</ent_seq>
<k_ele>
<keb>鈍い</keb>
<ke_pri>ichi1</ke_pri>
<ke_pri>news2</ke_pri>
<ke_pri>nf30</ke_pri>
</k_ele>
<r_ele>
<reb>にぶい</reb>
<re_pri>ichi1</re_pri>
<re_pri>news2</re_pri>
<re_pri>nf30</re_pri>
</r_ele>
<r_ele>
<reb>のろい</reb>
<re_pri>ichi1</re_pri>
</r_ele>
<sense>
<stagr>にぶい</stagr>
<pos>&adj-i;</pos>
<gloss>dull (e.g. a knife)</gloss>
<gloss>blunt</gloss>
</sense>
<sense>
<s_inf>のろい is usu. in kana</s_inf>
<gloss>thickheaded</gloss>
<gloss>obtuse</gloss>
<gloss>stupid</gloss>
</sense>
<sense>
<stagr>にぶい</stagr>
<gloss>dull (sound, color, etc.)</gloss>
<gloss>dim (light)</gloss>
</sense>
<sense>
<gloss>slow</gloss>
<gloss>sluggish</gloss>
<gloss>inert</gloss>
<gloss>lethargic</gloss>
</sense>
<sense>
<stagr>のろい</stagr>
<gloss>indulgent (esp. to the opposite sex)</gloss>
<gloss>doting</gloss>
</sense>
</entry>
</JMdict>

有问题的XML文件

http://ftp.monash.edu.au/pub/nihongo/JMdict_e.gz

问题澄清

请注意,在第一个结果中,只有一个感知条目与第二个结果的5个独立条目共同存在,尽管条目组成相同(两个xml文件按原样包含条目)。另外,第一组的结果是不完整的。最重要的是,解析器错过了'stagr'lelements。如果解析完全正常,那么两个结果都应该是相同的。

1 个答案:

答案 0 :(得分:0)

我认为这里发生的是你正在寻找两个不同的节点。如果你看一下第一个代码的ent_seq。您会看到它是1582510。我已经在原始文件中搜索了它,并使用ET.dump转储了XML对象,您实际分析的对象是:

<entry>
<ent_seq>1582510</ent_seq>
<k_ele>
<keb>内股膏薬</keb>
</k_ele>
<r_ele>
<reb>うちまたこうやく</reb>
</r_ele>
<r_ele>
<reb>うちまたごうやく</reb>
</r_ele>
<sense>
<pos>noun (common) (futsuumeishi)</pos>
<misc>yojijukugo</misc>
<gloss xml:lang="eng">double-dealer</gloss>
<gloss xml:lang="eng">fence-sitter</gloss>
<gloss xml:lang="eng">timeserver</gloss>
<gloss xml:lang="eng">moving back and forth between two sides in a     conflict</gloss>
<gloss xml:lang="eng">duplicity</gloss>
<gloss xml:lang="eng">turncoat</gloss>
</sense>
</entry>

这相当于您在第一个代码中获得的输出。第二个代码实际上是用ent_seq 1582430分析对象,这是一个完全不同的对象。