Дубликаты Elementtree в результате встроенных дочерних узлов

Я пытаюсь извлечь элементы из системы архивов парламента Великобритании, Hansard. Но xml не очень хорошо отформатирован. Например, он имеет следующую структуру: housecommons/debates/section/section/data housecommons/speeches/section/section/data housecommons/section/section/data

У меня есть код, который может получить данные, как показано ниже. Однако это приводит к дублированию значений. Я думаю, причина в том, что мой код не учитывает родительско-дочерние отношения и вместо этого просто ищет каждый маркер «раздела», следующий за первым маркером.

Может ли кто-нибудь посоветовать, как я могу адаптировать свой код, чтобы избежать дублирования?

doc = ET.parse(xmlFile)
for house in doc.iter('housecommons'):
    #print ('housecommon', house.tag)
    for debates in house.iter('debates'):
        print ('debates')
        #print (title)
        for section in debates.iter('section'):
            #print ("debates section", section.text)
            #title = ("title", section.find('title').text)
            print('debate section')
            for subsection in debates.iter('section'):
                print("debate subsection", subsection.text)
                #title = ("title", subsection.find('title').text)
                #print(title)

н.б. это тип вещей в необработанном xml, который я пытаюсь разобрать. Без публикации полного XML-файла сложная структура может быть не полностью очевидна.


<housecommons>
<image src="S6CV0001P0I0103"/>
<col>181</col>
<title>House of Commons</title>
<date format="1981-03-17">Tuesday 17 March 1981</date>
<p id="S6CV0001P0-00854"><i>The House met at half-past Two o'clock</i></p>
<debates>
<section>
<title>PRAYERS</title>
<p id="S6CV0001P0-00855">[MR. SPEAKER <i>in the Chair</i>]</p>
<section>
<title>PRIVATE BUSINESS</title>
<section>
<title>CHARTERHOUSE JAPHET BILL</title>
<p id="S6CV0001P0-00856"><i>Bill read the Third time and passed, with amendments.</i></p>
<section>
<title>BARNSLEY BOROUGH COUNCIL BILL</title>
<p id="S6CV0001P0-00857"><i>Further considered; to be read the Third time.</i></p>
</section>
</section>
</section>
</section>
</housecommons>

person Ian Stewart    schedule 29.07.2020    source источник
comment
Можете ли вы отредактировать свой вопрос и убедиться, что образец xml действителен?   -  person Jack Fleeting    schedule 30.07.2020


Ответы (1)


метод iter(…) будет рекурсивно перебирать все поддеревья XML под ним (его дочерние элементы, их дочерние элементы и т. д.)

Я думаю, вы можете использовать такую ​​​​структуру

for child in parent:
    if child.tag == 'debates':
         # look further

Метод iter(…) спускается более чем на один уровень вглубь при поиске предоставленного вами имени тега. Вот почему появляются дубликаты.

person JimmyNJ    schedule 30.07.2020