Для работы с 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