Python условия вывода
коллеги. Столкнулся с проблемой, очень долго мучаюсь, прошу помощи. У меня есть телеграм бот который парсит html файл, встала задача парсить 2 файла одновременно. Они чуть друг от друга отличаются и разные классы. Я написал аналогично первому файлу цикл который проходится по названиям и должен возвратить столбцы названия города и остатки на складе. Дело в том, что в таблице класс цены R2C1 и так же остатки под городами идут в таком же классе и вместо первого города Екатеринбург у которого остаток == 1
Тут я получаю возврат со своего бота, у меня остатки сдвигаются на 1 элемент вперёд, то есть у ЕКБ должен быть остаток 1 и так далее, но у меня ЕКБ принимает вместо остатка цену:
**Остатки актуальны на: 19.09.2023 11:32:34**
R4EN6040, SMEG R4EN6040 Комплект направляющих для противней 600х400 на 4 шт для пароконвектоматов серии PO/SPO, Товар, SMEG
Цена: 14 040,00
ЕкатеринбургОсновной: 14 040,00
Краснодар - Основной: 1
МОСКВА - ДСВ ОСНОВНОЙ - ПРОФ: 8
НовосибирскОсновной СТА Карго: 3
Санкт-Петербург Основной_СТА Карго: 12
<tr class="R2">
<td class="R2C0"><span style="white-space:nowrap;max-width:0px;">3743, SMEG 3743 Комплект противней алюминиевых (4 шт.) 600х400 мм, Товар, SMEG</span></td>
<td class="R2C1" colspan="2"><span style="white-space:nowrap;max-width:0px;">11 880,00</span></td>
<td class="R2C1"><span style="white-space:nowrap;max-width:0px;">4</span></td>
<td class="R2C1"><span style="white-space:nowrap;max-width:0px;">15</span></td>
<td class="R2C1"><span style="white-space:nowrap;max-width:0px;">46</span></td>
<td class="R2C1"><span style="white-space:nowrap;max-width:0px;">8</span></td>
<td class="R2C1"><span style="white-space:nowrap;max-width:0px;">7</span></td>
<td class="R2C1"><span style="white-space:nowrap;max-width:0px;">80</span></td>
<td><span></span></td>
<td></td>
</tr>
По первому циклу всё норм, там в файле разные классы цены и городов, но по второму никак совсем. Делал проверку на название. Приводил цену к числовому формату и сравнивал значения по условию. Пытался добавлять " " пустое значение cities2 перед городами, остатки возвращались правильными, но последний город не отображался
def search_equipment(message):
nomination = message.text
soup = read_file()
equipment_rows = soup.find_all('tr', class_=['R5'])
second_soup = read_second_file()
second_equipment_rows = second_soup.find_all('tr', class_=['R2'])
# МАССИВ ГОРОДОВ ИЗ HTML ПЕРВОГО ФАЙЛА (ПАРСИНГ ГОРОДОВ НЕ СРАБАТЫВАЛ, ПРИВЕДЕНО К АЛЬТЕРНАТИВНОМУ РЕШЕНИЮ)
cities = ['Владивосток', 'Волжск', 'Екатеринбург', 'Краснодар', 'Москва (ЦФО)', 'Нижний Новгород', 'Новосибирск', 'Омск',
'Пермь', 'Пятигорск', 'Ростов-на Дону', 'Санкт-Петербург', 'Симферополь', 'Тюмень', 'Уфа', 'Хабаровск',
'Челябинск', 'Ярославль']
cities2 = ['ЕкатеринбургОсновной', 'Краснодар - Основной', 'МОСКВА - ДСВ ОСНОВНОЙ - ПРОФ','НовосибирскОсновной СТА Карго','Санкт-Петербург Основной_СТА Карго' ]
results = ""
mod_time = os.path.getmtime("ostatki.htm")
mod_time_str = datetime.datetime.fromtimestamp(mod_time).strftime('%d.%m.%Y %H:%M:%S')
results += "**Остатки актуальны на: " + mod_time_str + "**\n"
# ПРОХОДИМСЯ ЦИКЛОМ ПО СТРОЧКАМ HTML ФАЙЛА КЛАССА R5 ПЕРВОГО ФАЙЛА
for row in equipment_rows:
equipment_field = row.find('td', class_='R5C0')
query_words = nomination.lower().split()
if all(word in equipment_field.text.lower() for word in query_words):
results += equipment_field.text.strip() + "\n"
price_field = equipment_field.find_next_sibling('td')
results += 'Цена: ' + price_field.text.strip() + "\n"
rest_fields = row.find_all('td', class_='R5C2')
for i, rest_field in enumerate(rest_fields):
count = rest_field.find('span').text.strip() if rest_field.find('span') else ""
if count:
results += cities[i] + ': ' + count + "\n"
results += '---------------\n'
# проходимся по второму файлу
for row in second_equipment_rows:
second_equipment_row = row.find('td', class_='R2C0')
query_words = nomination.lower().split()
if all(word in second_equipment_row.text.lower() for word in query_words):
results += second_equipment_row.text.strip() + "\n"
price_field = second_equipment_row.find_next_sibling('td')
results += 'Цена: ' + price_field.text.strip() + "\n"
rest_fields = row.find_all('td', class_='R2C1')
for i, rest_field in enumerate(rest_fields):
count = rest_field.find('span').text.strip() if rest_field.find('span') else ""
if count:
results += cities2[i] + ': ' + count + "\n"
results += '---------------\n'
if len(results) > len("**Остатки актуальны на: " + mod_time_str + "**\n"):
if len(results) > 4096: # Проверка на размер сообщения
with open("full_ostatki.txt", "w", encoding="utf-8") as file:
file.write(results)
bot.send_document(message.chat.id, open("full_ostatki.txt", 'rb'), )
else:
bot.reply_to(message, results)
else:
bot.reply_to(message, "Не найдено или в ожидании поступления.")
Ответы (1 шт):
from bs4 import BeautifulSoup
html_table = """
<tr class="R2">
<td class="R2C0"><span style="white-space:nowrap;max-width:0px;">3743, SMEG 3743 Комплект противней алюминиевых (4 шт.) 600х400 мм, Товар, SMEG</span></td>
<td class="R2C1" colspan="2"><span style="white-space:nowrap;max-width:0px;">11 880,00</span></td>
<td class="R2C1"><span style="white-space:nowrap;max-width:0px;">4</span></td>
<td class="R2C1"><span style="white-space:nowrap;max-width:0px;">15</span></td>
<td class="R2C1"><span style="white-space:nowrap;max-width:0px;">46</span></td>
<td class="R2C1"><span style="white-space:nowrap;max-width:0px;">8</span></td>
<td class="R2C1"><span style="white-space:nowrap;max-width:0px;">7</span></td>
<td class="R2C1"><span style="white-space:nowrap;max-width:0px;">80</span></td>
<td><span></span></td>
<td></td>
</tr>
"""
cities2 = ['ЕкатеринбургОсновной',
'Краснодар - Основной',
'МОСКВА - ДСВ ОСНОВНОЙ - ПРОФ',
'НовосибирскОсновной СТА Карго',
'Санкт-Петербург Основной_СТА Карго']
results = ""
second_soup = BeautifulSoup(html_table, 'html.parser')
second_equipment_rows = second_soup(class_='R2')
for row in second_equipment_rows:
second_equipment_row, price_field, *rest_fields = row.stripped_strings
results += f'{second_equipment_row}\nЦена: {price_field}\n'
for citi2, count in zip(cities2, rest_fields):
results += f'{citi2}: {count}\n'
results += '---------------\n'
print(results)