Как извлечь данные в правильном порядке из таблицы 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']