Как правильно распарсить xml?

Добрый день. Необходимо сделать парсинг xml и записать в csv на python примерно такого вида:
<Root>
	<SubRoot>
		<Level1>A</Level1>
		<Level2>B</Level2>
		<Level3>C</Level3>
		<Level4>D</Level4>
	</SubRoot>

	<SubRoot>
		<Level1>1</Level1>
		<Level2>2</Level2>
		<Level3>3</Level3>
	</SubRoot>
</Root>

Мой код
for subroot in root.findall('SubRoot'):
    level1 = subroot.find('Level1').text
    level2 = subroot.find('Level2').text
    level3 = subroot.find('Level3').text
    level4 = subroot.find('Level4').text
    print level1
    print level2
    print level3
    print level4


В первом SubRoot содержится 4 уровня, во втором их 3. Срока level4 = subroot.find('Level4').text вызывает ошибку. Как сделать так, чтобы в заголовке столба файла csv попадали 4 уровня, первая строка заполнялась вся, а в последней ячейке второй строки было пусто. Пример в изображении ниже
5920b93f56f743368eef6c770733d3c3.png
  • Вопрос задан
  • 347 просмотров
Решения вопроса 1
Ba1t
@Ba1t
import csv
import xml.etree.ElementTree as ET


xml_data = """<?xml version="1.0"?>
<Root>
    ...
</Root>"""

root = ET.fromstring(xml_data)

header = set()
rows = []

for subroot in root:
    row = {}
    for level in subroot:
        header.add(level.tag)
        row[level.tag] = level.text
    rows.append(row)

with open('out.csv', 'w') as file:
    writer = csv.DictWriter(file, fieldnames=sorted(header))
    writer.writeheader()
    writer.writerows(rows)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@abcd0x00
>>> import xml.etree.ElementTree as etree
>>> import csv
>>> import sys
>>> 
>>> text = """\
... <Root>
...   <SubRoot>
...     <Level1>A</Level1>
...     <Level2>B</Level2>
...     <Level3>C</Level3>
...     <Level4>D</Level4>
...   </SubRoot>
... 
...   <SubRoot>
...     <Level1>1</Level1>
...     <Level2>2</Level2>
...     <Level3>3</Level3>
...   </SubRoot>
... </Root>
... """
>>> 
>>> root = etree.fromstring(text)
>>> 
>>> out = [[i.text for i in node] for node in root]
>>> out
[['A', 'B', 'C', 'D'], ['1', '2', '3']]
>>> 
>>> out = [(i + [None] * (4 - len(i))) for i in out]
>>> out
[['A', 'B', 'C', 'D'], ['1', '2', '3', None]]
>>> 
>>> writer = csv.writer(sys.stdout)
>>> writer.writerows(out)
A,B,C,D
1,2,3,
>>>
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы