Я думаю, что проблема с if event == 'start'
.
В соответствии с другими вопросами / ответами содержание атрибута text
гарантированно не будет определено.
Однако это не такпросто, как изменить на if event == 'end'
.Когда я попробовал это сам, я получал больше пустых полей, чем заполненных.( ОБНОВЛЕНИЕ: Использование event == 'end'
сработало, если я удалил events=("start", "end")
из iterparse
.)
В итоге получилось полностью игнорировать событие и просто проверить, нет ли text
было заполнено.
Обновлен код ...
import xml.etree.cElementTree as ET
import csv
xml_data_to_csv = open('Out2.csv', 'w', newline='', encoding='utf8')
Csv_writer = csv.writer(xml_data_to_csv, delimiter=';')
file_path = "Products_50_producten.xml"
context = ET.iterparse(file_path, events=("start", "end"))
EcommerceProductGuid = ""
ProductNumber = ""
Description = ""
ShopSalesPriceInc = ""
Barcode = ""
AvailabilityStatus = ""
Brand = ""
for event, elem in context:
tag = elem.tag
text = elem.text
if tag == 'EcommerceProductGuid' and text:
EcommerceProductGuid = text
elif tag == 'ProductNumber' and text:
ProductNumber = text
elif tag == 'Description' and text:
Description = text
elif tag == 'SalesPriceInc' and text:
ShopSalesPriceInc = text
elif tag == 'Barcode' and text:
Barcode = text
elif tag == 'AvailabilityStatus' and text:
AvailabilityStatus = text
elif tag == 'Brand' and text:
Brand = text
if event == 'end' and tag == "Product":
product_tag = False
List_nodes = []
List_nodes.append(EcommerceProductGuid)
List_nodes.append(ProductNumber)
List_nodes.append(Description)
List_nodes.append(ShopSalesPriceInc)
List_nodes.append(Barcode)
List_nodes.append(AvailabilityStatus)
List_nodes.append(Brand)
Csv_writer.writerow(List_nodes)
print(EcommerceProductGuid)
List_nodes.clear()
EcommerceProductGuid = ""
ProductNumber = ""
Description = ""
ShopSalesPriceInc = ""
Barcode = ""
AvailabilityStatus = ""
Brand = ""
elem.clear()
xml_data_to_csv.close()
Это сработало с моим тестовым файлом из 300 Product
элементов.
Также яЯ думаю, вы могли бы упростить свой код, если бы использовали словарь и пример csv.DictWriter
.
(выдает тот же результат, что и код выше) ...
import xml.etree.cElementTree as ET
import csv
from copy import deepcopy
field_names = ['EcommerceProductGuid', 'ProductNumber', 'Description',
'SalesPriceInc', 'Barcode', 'AvailabilityStatus', 'Brand']
values_template = {'EcommerceProductGuid': "",
'ProductNumber': "",
'Description': "",
'SalesPriceInc': "",
'Barcode': "",
'AvailabilityStatus': "",
'Brand': ""}
with open('Out2.csv', 'w', newline='', encoding='utf8') as xml_data_to_csv:
csv_writer = csv.DictWriter(xml_data_to_csv, delimiter=';', fieldnames=field_names)
file_path = "Products_50_producten.xml"
context = ET.iterparse(file_path, events=("start", "end"))
values = deepcopy(values_template)
for event, elem in context:
tag = elem.tag
text = elem.text
if tag in field_names and text:
values[tag] = text
if event == 'end' and tag == "Product":
csv_writer.writerow(values)
print(values.get('EcommerceProductGuid'))
values = deepcopy(values_template)
elem.clear()