Найти тему
YG

Python парсинг xml в csv

Оглавление

Для работы с xml нам понадобится модуль xml.etree.ElementTree, а для работы с csv - модуль csv.

Исходный код:

#Импорт необходимых модулей
import xml.etree.ElementTree as et
import csv

#Открываем файл data.csv на чтение. Если его нет, то он интерпретатор его создаст автоматически
result_data = open('data.csv', 'w')

#Записываем в tree данные из xml
tree = et.parse('products.xml')

#Считываем содержимое корневого элемента
root = tree.getroot()

#Создаем список заголовков для записи первой строки в файл data.csv
result_head = []

#Добавляем заголовки в список
result_head.append('category')
result_head.append('product_id')
result_head.append('name')
result_head.append('Цена')

#Записываем заголовки в первую строчку data.csv
csvwriter.writerow(result_head)

#Ищем все дочерние элементы в корневом элементе shop
for child in root.findall('shop'):

#Ищем содержимое 3-го дочернего элемента shop и записываем в product_list
product_list = child[2]

#Ищем в products все product
for product in product_list.findall('product'):

#Создаем список для характеристик продукта
product_props = []

#Ищем значения характеристик и записываем их в переменные
category = product.find('category').text
product_props.append(category)

product_id = product.attrib['id']
product_props.append(product_id)

name = product.find('name').text
product_props.append(name)

param1 = product.find(".//param/.[@name='Цена']").text
product_props.append(param1)

csvwriter.writerow(product_props)
result_data.close()

Содержимое products.xml:

<?xml version="1.0" encoding="utf-8"?>

<yml_catalog date="2019-07-22 17:22">

<shop>

<colors>

<color id="1">Красный</color>

</colors>

<properties>

<property id="1">Шерстяная</property>

</properties>

<products>

<product>

<id>1</id>

<name>Вязаная шапка</name>

<description>Шерсть 100%</description>

<category>Шапки</category>

<param name="Цена">30000</param>

</product>

</products>

</shop>

</yml_catalog>

Результат

В результате у вас будет csv файл, где в первой строке будут заголовки, а во второй - значение xml-тегов: id, name, category, param