Как сделать таблицу из HTML кода на python

Сижу, не могу понять как это сделать, подскажите пожалуйста.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<meta content="width=device-width, initial-scale=1.0" name="viewport"/>
<title>Document</title>
</head>
<body>
<table>
<tr>
<th>Название фильма</th>
<th>Режиссёр</th>
<th>Актёрский состав</th>
<th>Рейтинг фильма</th>
<th>Год</th>
</tr>
<tr>
<td>Седьмая печать</td>
<td>Ингмар Бергман</td>
<td>Макс фон Сюдов, Гуннар Бьёрнстранд, Биби Андерссон</td>
<td>5</td>
<td>1957</td>
</tr>
<tr>
<td>Остров проклятых</td>
<td>Мартин Скорсезе</td>
<td>Леонардо Ди Каприо, Марк Руффало, Бен Кингсли, Эмили Мортимер</td>
<td>4</td>
<td>2010</td>
</tr>
<tr>
<td>Земляничная поляна</td>
<td>Ингмар Бергман</td>
<td>Виктор Шёстрём, Ингрид Тулин, Биби Андерссон</td>
<td>5</td>
<td>1957</td>
</tr>
<tr>
<td>Час волка</td>
<td>Ингмар Бергман</td>
<td>Макс фон Сюдов, Лив Ульман, Ингрид Тулин</td>
<td>3</td>
<td>1968</td>
</tr>
</table>
</body>
</html>

Как из этого сделать таблицу в python, чтобы столбики были

<th>Название фильма</th>
<th>Режиссёр</th>
<th>Актёрский состав</th>
<th>Рейтинг фильма</th>
<th>Год</th>

А таблица должна быть заполнена

<td>Остров проклятых</td>
<td>Мартин Скорсезе</td>
<td>Леонардо Ди Каприо, Марк Руффало, Бен Кингсли, Эмили Мортимер</td>
<td>4</td>
<td>2010</td>

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

Автор решения: Namerek
import pandas as pd
html_doc = """
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<meta content="width=device-width, initial-scale=1.0" name="viewport"/>
<title>Document</title>
</head>
<body>
<table>
<tr>
<th>Название фильма</th>
<th>Режиссёр</th>
<th>Актёрский состав</th>
<th>Рейтинг фильма</th>
<th>Год</th>
</tr>
<tr>
<td>Седьмая печать</td>
<td>Ингмар Бергман</td>
<td>Макс фон Сюдов, Гуннар Бьёрнстранд, Биби Андерссон</td>
<td>5</td>
<td>1957</td>
</tr>
<tr>
<td>Остров проклятых</td>
<td>Мартин Скорсезе</td>
<td>Леонардо Ди Каприо, Марк Руффало, Бен Кингсли, Эмили Мортимер</td>
<td>4</td>
<td>2010</td>
</tr>
<tr>
<td>Земляничная поляна</td>
<td>Ингмар Бергман</td>
<td>Виктор Шёстрём, Ингрид Тулин, Биби Андерссон</td>
<td>5</td>
<td>1957</td>
</tr>
<tr>
<td>Час волка</td>
<td>Ингмар Бергман</td>
<td>Макс фон Сюдов, Лив Ульман, Ингрид Тулин</td>
<td>3</td>
<td>1968</td>
</tr>
</table>
</body>
</html>
"""

df, *_ = pd.read_html(html_doc)
print(df)

df.to_excel('data.xlsx', engine='openpyxl', index=False)

введите сюда описание изображения

data.xlsx введите сюда описание изображения

→ Ссылка
Автор решения: gil9red

Для парсинга таблицы используется bs4, а для вывода таблицы как ascii библиотека tabulate

Код (пример text в конце ответа):

# pip install tabulate
from tabulate import tabulate

# pip install bs4
from bs4 import BeautifulSoup


root = BeautifulSoup(text, 'html.parser')
trs = root.select_one('table').select('tr')

headers = [th.text for th in trs[0].select('th')]
rows = [
    [td.text for td in tr.select('td')]
    for tr in trs[1:]
]

print(tabulate(rows, headers=headers, tablefmt="grid"))

Результат:

+--------------------+-----------------+---------------------------------------------------------------+------------------+-------+
| Название фильма    | Режиссёр        | Актёрский состав                                              |   Рейтинг фильма |   Год |
+====================+=================+===============================================================+==================+=======+
| Седьмая печать     | Ингмар Бергман  | Макс фон Сюдов, Гуннар Бьёрнстранд, Биби Андерссон            |                5 |  1957 |
+--------------------+-----------------+---------------------------------------------------------------+------------------+-------+
| Остров проклятых   | Мартин Скорсезе | Леонардо Ди Каприо, Марк Руффало, Бен Кингсли, Эмили Мортимер |                4 |  2010 |
+--------------------+-----------------+---------------------------------------------------------------+------------------+-------+
| Земляничная поляна | Ингмар Бергман  | Виктор Шёстрём, Ингрид Тулин, Биби Андерссон                  |                5 |  1957 |
+--------------------+-----------------+---------------------------------------------------------------+------------------+-------+
| Час волка          | Ингмар Бергман  | Макс фон Сюдов, Лив Ульман, Ингрид Тулин                      |                3 |  1968 |
+--------------------+-----------------+---------------------------------------------------------------+------------------+-------+

UPD. Для большей обработки данных, их удобно подготовить, например, выше все значения ячеек были строками, а это не всегда удобно, тогда имеет смысл дописать парсер. Дополнительно добавил примеры сортировки списка rows:

rows = []
for tr in trs[1:]:
    name, director, actors, rating, year = (td.text for td in tr.select('td'))
    rating = int(rating)
    year = int(year)
    rows.append([name, director, actors, rating, year])

rows.sort(key=lambda x: x[4])  # Сортировка по годам
# rows.sort(key=lambda x: (x[4], x[3], x[0]))  # Сортировка по годам, рейтингу и названию
print(tabulate(rows, headers=headers, tablefmt="grid"))

Текст:

text = """
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<meta content="width=device-width, initial-scale=1.0" name="viewport"/>
<title>Document</title>
</head>
<body>
<table>
<tr>
<th>Название фильма</th>
<th>Режиссёр</th>
<th>Актёрский состав</th>
<th>Рейтинг фильма</th>
<th>Год</th>
</tr>
<tr>
<td>Седьмая печать</td>
<td>Ингмар Бергман</td>
<td>Макс фон Сюдов, Гуннар Бьёрнстранд, Биби Андерссон</td>
<td>5</td>
<td>1957</td>
</tr>
<tr>
<td>Остров проклятых</td>
<td>Мартин Скорсезе</td>
<td>Леонардо Ди Каприо, Марк Руффало, Бен Кингсли, Эмили Мортимер</td>
<td>4</td>
<td>2010</td>
</tr>
<tr>
<td>Земляничная поляна</td>
<td>Ингмар Бергман</td>
<td>Виктор Шёстрём, Ингрид Тулин, Биби Андерссон</td>
<td>5</td>
<td>1957</td>
</tr>
<tr>
<td>Час волка</td>
<td>Ингмар Бергман</td>
<td>Макс фон Сюдов, Лив Ульман, Ингрид Тулин</td>
<td>3</td>
<td>1968</td>
</tr>
</table>
</body>
</html>
"""
→ Ссылка