Всем привет! Очень удачно сразу попалась тема парсинга xml)
У меня такой вопрос к коллегам по Python и библиотекам парсинга XML.
Потребовалось написать скрипт, который проходится по файлу и сравнивает две цены у всех товаров - новую и старую (price и oldprice). Моя задача понять, что эти цены отличаются минимум на 5%. Если отличие меньше, то это ошибка, потому что тег oldprice, в таком случае, выводиться в фид не должен.
Порылся на просторах интернета на тему библиотек xml питона. Приглянулась стандартная xml.minidom.
Что сделал. Я смог получить атрибут цены и получил два списка каждой цены.
Но элементы этих списков нельзя сравнивать, т.к. oldprice встречается не у каждого товара (примерно у трети товаров).
То есть, по хорошему, мне нужно проверять для каждого товара, наличие в нем дочернего товара oldprice. И если таковой имеется, то сравнить цену price и oldprice (или создать два списка и потом их сравнить поэлементно).
Я застрял на том, то не знаю как мне понять, есть ли тег oldprice в <offer></offer>. Как можно это реализовать? Есть какие-то методы, которые выдают вложенные теги? Или типа того..
Буду рад любым ответам, но хорошо бы найти решение в рамках одной библиотеки, которую я использую.
Пример XML:
<offer available="true" id="580">
<url></url>
<oldprice>13870.00</oldprice>
<price>13801.00</price>
<currencyId>RUR</currencyId>
<categoryId type="Own">14102</categoryId>
<picture></picture>
<delivery>true</delivery>
<local_delivery_cost>650</local_delivery_cost>
<param name="Условия доставки">A</param>
<name>Бассейн каркасный INTEX 56942</name>
<description>&nbsp;Реальный цвет может отличаться от представленного на сайте, ввиду различных настроек монитора.</description>
<vendor></vendor>
<delivery-condition>A</delivery-condition>
<country_of_origin>Китай</country_of_origin>
</offer>
<offer available="true" id="585">
<url></url>
<price>453.00</price>
<currencyId>RUR</currencyId>
<categoryId type="Own">14102</categoryId>
<picture></picture>
<delivery>true</delivery>
<local_delivery_cost>650</local_delivery_cost>
<param name="Условия доставки">A</param>
<name>Тент для бассейна INTEX 366*366см</name>
<description>Защитное покрытие для каркасного бассейна 366х25см. Материалы: полимерные материалы. Реальный цвет может отличаться от представленного на сайте, ввиду различных настроек монитора.</description>
<vendor></vendor>
<delivery-condition>A</delivery-condition>
<country_of_origin>Китай</country_of_origin>
</offer>
Пример моего кода:
from xml.dom import minidom
xml_path = minidom.parse('../exemple.xml')
price_list = xml_path.getElementsByTagName('price') #получаю словарь из price
price_items_list = []
for price in price_list:
price_items_list.append(price.childNodes[0].nodeValue) #добавляю в изначально пустой список значения тега price
oldprice_list = xml_path.getElementsByTagName('oldprice')
oldprise_item_list = []
for oldprice1 in oldprice_list:
oldprise_item_list.append(oldprice1.childNodes[0].nodeValue)
print(price_items_list) #['13801.00', '453.00', '621.00', '1561.00', '117.00', '14701.00',...]
print(oldprise_item_list) #['13801.00', '453.00', '600.00', '1561.00', '2500.00', '14701.00',...]