заполнение XML шаблона данными - Python
Задача следующая- написал парсер, который собирает цены конкурентов из маркетплейса. Нужно результат парсинга сохранить в XML файл определенной структуры. Данные по одной карточке товара записываются вот в такой блок:
<offer sku="232130223">
<model>iphone 6s white 32gb</model>
<brand>Apple</brand>
<availabilities>
<availability available="yes" storeId="PP1"/>
<availability available="yes" storeId="PP2"/>
...
</availabilities>
<cityprices>
<cityprice cityId="750000000">193000</cityprice>
<cityprice cityId="710000000">195000</cityprice>
...
</cityprices>
</offer>
Здесь cityprice это цена товара в определенном городе с cityID, то есть я по каждому городу цену получаю отдельном запросом. Товары могут продаваться в разных городах. Так вот мне нужно сделать чтобы все цены попали в этот один блок. Подскажите, пожалуйста, как лучше сделать ?
Ниже кусок кода по этой задаче:
import requests
from loguru import logger
from fake_useragent import UserAgent
import json
import urllib
import aiohttp
import asyncio
import time
import random
async def get_card(self, url, name, sku, cities):
for city in cities:
payload="{\"cityId\": "f"\"{city['id']}\""", \"limit\": 5, \"page\": 0, \"sort\":true}"
pickupPoints = city['pickupPoints'][0]['displayName']
headers = {
'Connection': 'keep-alive',
'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="99", "Google Chrome";v="99"',
'Accept': 'application/json, text/*',
'Content-Type': 'application/json; charset=UTF-8'
}
proxy = 'http://uname:pass@' + random.choice(self.proxies)
async with self.session.post(url, headers=headers, data=payload) as response:
try:
r = await response.json(content_type=None)
price = str(r['offers'][0]['price'])[:-2]
self.add_new_offer(name, price, sku, pickupPoints)
except:
pass
def add_new_offer(self,name, price, sku, pickupPoints):
offer = f'''<offer sku="{sku}">
<model>{name}</model>
<brand></brand>
<availabilities>
<availability available="yes" storeId={pickupPoints}/>
<availability available="yes" storeId={pickupPoints}/>
</availabilities>
<cityprices>
<cityprice cityId="750000000">{price}</cityprice>
<cityprice cityId="710000000">{price}</cityprice>
</cityprices>
</offer>'''
self.offers += '\n ' + offer
def create_xml(self, CompanyName, CompanyID):
xmlTemplate = f'''<?xml version="1.0" encoding="utf-8"?>
<kaspi_catalog date="string"
xmlns="kaspiShopping"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="kaspiShopping http://kaspi.kz/kaspishopping.xsd">
<company>{CompanyName}</company>
<merchantid>{CompanyID}</merchantid>
<offers>
{self.offers}
</offers>
</kaspi_catalog>'''
f = open('offers.xml', 'w')
f.write(xmlTemplate)
f.close()
Ответы (1 шт):
Автор решения: Сергей Шашко
→ Ссылка
id =((750000000, 193000),(710000000,195000))
cc =''
for i in id:
cc +=f'''{' '*12}<cityprice cityId="{i[1]}">{i[2]}</cityprice>\n'''
res =f'''<offer sku="232130223">
<model>iphone 6s white 32gb</model>
<brand>Apple</brand>
<availabilities>
<availability available="yes" storeId="PP1"/>
<availability available="yes" storeId="PP2"/>
...
</availabilities>
<cityprices>
{cc}
...
</cityprices>
</offer>
'''