/
Pavz
/
Project_case3
Обзор
Документация
Войти
/
Pavz
/
Project_case3
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
main
utils/parser.py
109 строк
5 KB
pavel
Add utils
01 дек 2025, 01:33
01 дек 2025, 01:33
d8e2891
Код
Авторство
О чём код?
''' Обработка стартового xml файла в json, обрезание ненужных полей ''' from bs4 import BeautifulSoup import json import re from collections import defaultdict # --- Вспомогательные функции --- def text_of(tag): return tag.get_text(" ", strip=True) if tag else "" #звлекает весь текст из тега и всех его вложенных дочерних тегов, игнорируя сами HTML/XML-теги. # Эта функция безопасно извлекает текст из XML/HTML-тега, обрабатывая два важных случая: # Если tag существует → # Объединяет весь текст внутри тега (включая вложенные теги) в одну строку, # Заменяет переносы и пробелы между тегами на один пробел (благодаря " " в get_text(" ")), # Убирает пробелы по краям (благодаря strip=True). # Если tag — None (например, тег не найден) → # Возвращает пустую строку "", не вызывая ошибку. def safe_float(val): ### а надо ли оно??? if not val: return None try: return float(val.replace(',', '.')) except Exception: return None # --- Чтение XML файла --- with open('export_fid_spool_clear_regexp5-utf8.xml', 'r', encoding='utf-8') as f: xml_data = f.read() soup = BeautifulSoup(xml_data, 'xml') # ============================ # 1) Парсим категории # ============================ categories = [] for cat in soup.find_all('category'): cid = cat.get('id') parent = cat.get('parentId') or None name_tag = cat.find('NAME') or cat.find('name') cname = text_of(name_tag) if name_tag else cat.get_text(" ", strip=True) categories.append({ "id": cid, "parentId": parent, "name": cname, }) with open('categories.json', 'w', encoding='utf-8') as f: json.dump(categories, f, ensure_ascii=False, indent=2) print(f"Категории сохранены: {len(categories)}") # ============================ # 2) Парсим офферы # ============================ offers = [] for offer in soup.find_all('offer'): # от <offer> до <offer> item = { "id": offer.get("id"), # Уникальный идентификатор товара — это атрибут id у тега <offer>: # "available": offer.get("available"), # кажтется оно не надо "url": text_of(offer.find("url")), "price": safe_float(text_of(offer.find("price"))), # "oldprice": safe_float(text_of(offer.find("oldprice"))), # не надо # "currency": text_of(offer.find("currencyId")), # скорее всего бесполезно, везде RUB "categoryId": text_of(offer.find("categoryId")), # категория для товара "pictures": text_of(offer.find('picture')), # ссылка на picture # "sales_notes": text_of(offer.find("sales_notes")), # не надо # "delivery": text_of(offer.find("delivery")), # не надо # "local_delivery_cost": safe_float(text_of(offer.find("local_delivery_cost"))), # не надо "name": text_of(offer.find("name")), # полезно "vendor": text_of(offer.find("vendor")), # продавец "country_of_origin": text_of(offer.find("country_of_origin")), "description": text_of(offer.find("description")).replace('<br>',' '), # можно "market_description": text_of(offer.find("market_description")), # можно "weight": safe_float(text_of(offer.find("weight"))), # не надо } # --- Параметры товара (param) --- params = defaultdict(list) for p in offer.find_all('param'): # здесь сами признаки объекта. Но это очень разнородная информация pname = p.get('name') or "unknown_param" punit = p.get("unit") pvalue = text_of(p) if punit: pvalue = f"{pvalue} ({punit})" params[pname].append(pvalue) #!!! Функция заменена на другую в процессе работы со скриптом для БД !!! #========================================================================== # Сжимаем одноэлементные списки #item["params"] = {k: v[0] if len(v) == 1 else v for k, v in params.items()} #========================================================================== #вместо добавления списка теперь будет добавляться строка item['params'] = {k: v[0] if len(v) == 1 else ' '.join(v) for k,v in params.items()} offers.append(item) with open('offers.json', 'w', encoding='utf-8') as f: json.dump(offers, f, ensure_ascii=False, indent=2) print(f"Офферы сохранены: {len(offers)}")