Проблема извлечения данных из 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)
Вернуться на верх