Проблема извлечения данных из xml с помощью etree.ElementTree
Я работаю с JMDict (https://www.edrdg.org/jmdict/j_jmdict.html). Вот небольшой пример данных, с которыми у меня возникли проблемы:
Я работаю с Django и etree.ElementTree для извлечения данных. Вот мой код:
# -*- coding: utf-8 -*-
import xml.etree.ElementTree as ET
treeW = ET.parse('D:\Dev\kanjitest\kanjitest\static\dbxml\JMdict.xml')
rootW = treeW.getroot()
wordsKanjiXml = rootW.findall(".//entry")
entryId =0
for wordsKanjiEntry in wordsKanjiXml:
entry = {}
entryKanji =''
entryKana =''
entryMeanings = []
# -------------
for parts in wordsKanjiEntry:
sensesList=[]
if parts.tag == 'k_ele':
for kanji in parts:
if kanji.tag == 'keb':
entryKanji=kanji.text
if parts.tag=='sense':
for sense in parts:
if sense.tag == 'gloss':
if 'spa' in sense.attrib.values():
sensesList.append(sense.text)
if sensesList:
entryMeanings=sensesList
if parts.tag == 'r_ele':
for kana in parts:
if kana.tag == 'reb':
entryKana=kana.text
# -------------
entryId =entryId+1
entry=dict(
kanji = entryKanji,
kana = entryKana,
meanings = entryMeanings
)
if literal in entryKanji:
words.append(entry)
Итак, проблема заключается в последнем условии. literal
- это переменная в другой части кода, содержащая китайский иероглиф в строке. Например, 古. Таким образом, если слово содержит эту конкретную строку, запись будет добавлена в список под названием words
. Проблема заключается в том, что записи содержат несколько написаний для одного и того же слова (как в примере xml, который я разместил). 古い может быть написано '古い', или '故い', или '旧い'. Поскольку в нем есть несколько тегов <keb>
, кажется, что условие не применяется, даже если один из них действительно истинный. Я не знаю, достаточно ли хорошо я объясняю, но надеюсь, что кто-нибудь поймет и поможет мне доработать последнее условие, чтобы если любой из тегов <keb>
содержит literal
, код выполнялся.
Присутствует только последнее значение в entryKanji
, поэтому оно может совпадать или не совпадать со значением в literal
.
Создание списка entryKanji
и тестирование с помощью literal='古'
.
# -*- coding: utf-8 -*-
import xml.etree.ElementTree as ET
treeW = ET.parse('/home/luis/tmp/test.xml')
rootW = treeW.getroot()
literal='古'
words = []
wordsKanjiXml = rootW.findall(".//entry")
entryId =0
for wordsKanjiEntry in wordsKanjiXml:
entry = {}
entryKanji =[]
entryKana =''
entryMeanings = []
# -------------
for parts in wordsKanjiEntry:
sensesList=[]
if parts.tag == 'k_ele':
for kanji in parts:
if kanji.tag == 'keb':
entryKanji.append(kanji.text)
if parts.tag=='sense':
for sense in parts:
if sense.tag == 'gloss':
if 'spa' in sense.attrib.values():
sensesList.append(sense.text)
if sensesList:
entryMeanings=sensesList
if parts.tag == 'r_ele':
for kana in parts:
if kana.tag == 'reb':
entryKana=kana.text
# -------------
entryId =entryId+1
entry=dict(
kanji = entryKanji,
kana = entryKana,
meanings = entryMeanings
)
if literal in ''.join(entryKanji) :
words.append(entry)
print(words)
Результат:
[{'kanji': ['古い', '故い', '旧い'], 'kana': 'ふるい', 'meanings': []}]
Составление списка сущностей XML для проверки также работает
entryKanji =[]
entryKanjiEnt =[]
# existing code
for kanji in parts:
if kanji.tag == 'keb':
entryKanji.append(kanji.text)
entryKanjiEnt.append(kanji.text.encode('ascii', 'xmlcharrefreplace'))
# existing code
if b''.join(entryKanjiEnt).find(literal.encode('ascii', 'xmlcharrefreplace')) != -1:
words.append(entry)