Как извлечь данные в правильном порядке из таблицы html

Есть часть html-кода с заголовками таблицы - tags:

[<thead>
<tr>
<th rowspan="2">Столбец1</th>
<th class="right" rowspan="2">Столбец2</th>
<th class="right" rowspan="2">Столбец3</th>
<th colspan="4">Включая:</th>
<th class="right" rowspan="2">Столбец8</th>
<th class="right" rowspan="2">Столбец9</th>
</tr>
<tr>
<th class="right">Столбец4</th>
<th class="right">Столбец5</th>
<th class="right">Столбец6</th>
<th class="right">Столбец7</th>
</tr>
</thead>]

Структура таблицы выглядит примерно так: введите сюда описание изображения

Необходимо вытащить заголовки в правильном порядке, чтобы значения столбцов шли в соответствии порядковому номеру столбца (Столбец1, Столбец2, Столбец3, Столбец4, Столбец5) и т.д

Мой код:

th_tags = tags[0].find_all('th')
all_data = []
for h in th_tags:
    if ':' not in h.get_text():
        all_data.append(h.get_text())

Но он выводит данные в неправильном порядке:

(Столбец1, Столбец2, Столбец3, Столбец8, Столбец9, Столбец4, Столбец5, Столбец6, Столбец7)

Ответы (1 шт):

Автор решения: Сергей Кох

Разбиваем названия столбцов на два списка и затем меняем значение мультииндекса 'Включая:' на его подэлементы.

from bs4 import BeautifulSoup

html = """<thead>
            <tr>
                <th rowspan="2">Столбец1</th>
                <th class="right" rowspan="2">Столбец2</th>
                <th class="right" rowspan="2">Столбец3</th>
                <th colspan="4">Включая:</th>
                <th class="right" rowspan="2">Столбец8</th>
                <th class="right" rowspan="2">Столбец9</th>
            </tr>
            <tr>
                <th class="right">Столбец4</th>
                <th class="right">Столбец5</th>
                <th class="right">Столбец6</th>
                <th class="right">Столбец7</th>
            </tr>
        </thead>"""


all_data = []

root = BeautifulSoup(html, 'html.parser')
# Выбираем заголовок таблицы.
thead_tag = root.find('thead')
# Разделяем заголовок на два списка, во втором все подэлементы 'Включая:'.
texts = [tr_tag.text.split() for tr_tag in thead_tag if tr_tag != '\n']
print(texts)
# Заменяем в первом списке элемент 'Включая:' его подэлементами.
for text_0 in texts[0]:
    if text_0 == 'Включая:':
        for text_1 in texts[1]:
            all_data.append(text_1)
    else:
        all_data.append(text_0)

print(all_data)

------------------------------

[['Столбец1', 'Столбец2', 'Столбец3', 'Включая:', 'Столбец8', 'Столбец9'], ['Столбец4', 'Столбец5', 'Столбец6', 'Столбец7']]
['Столбец1', 'Столбец2', 'Столбец3', 'Столбец4', 'Столбец5', 'Столбец6', 'Столбец7', 'Столбец8', 'Столбец9']
→ Ссылка