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&nbsp;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&nbsp;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)
→ Ссылка