Как правильно получить CSV с данными из HTML таблицы?
У меня стоит задача получить .csv с данными из HTML таблицы.
Я из всего не нужного HTML документа смог вытащить таблицу - код парсера:
from bs4 import BeautifulSoup
from bs4.element import Tag
def open_file():
html = open('table.html','r' ,encoding='utf-8')
html_sorted = open('html_sorted.html', 'w+',encoding='utf-8')
soup = BeautifulSoup(html, 'lxml')
title = soup.find('div', class_='row')
table = soup.find('table', class_='table')
table = str(table)
title = str(title)
html_sorted.write(title + table)
html.close()
html_sorted.close()
open_file()
Каждое утро понедельника у меня будет такая таблица на выходе из которой мне нужно вытягивать данные за последнюю неделю...

...и помещать в .csv файл в таком виде.

Изначально на выходе 10 дат. Если даты идут последовательно, к примеру с 1(понедельник) по 7(воскресенье), то нужен срез за последние 7. На следующей неделе с 8 по 14. А если даты пропускаются, мне нужно в отчет вывести информацию по этим датам с цифрой 0. К примеру в таблице отсутствует 5 число, но в отчете оно нужно со всеми значениями справа в "0". Мне нужно все данные из где дата как-то сортировать, добавлять и не потерять привязку к полю с датой остальных полей справа с оценками. Просто эти самые с датой ни к какому классу или id не относятся. Как и tr со всей строкой.
Прошу помочь подобрать нужные инструменты для решения. С чего начать?
Ответы (1 шт):
Воспользуйтесь методом pandas.read_html():
import pandas as pd
all_tabs_in_page = pd.read_html(url_or_html)
Т.к. в общем случае в HTML документе может быть несколько таблиц, pd.read_html() всегда возвращает список найденных в документе таблиц, даже если в документе всего одна таблица.
Поэтому сначала следует вручную проверить по какому индексу находиться интересуемая вас таблица. И после этого использовать в коде найденный индекс:
df = pd.read_html(url_or_html)[0]
df.to_csv(filename, index=False)
Используя таким образом модуль Pandas можно легко, быстро и элегантно решать подобные задачи.
То же решение в видн однострочника:
pd.read_html(url_or_html)[0].to_csv(filename, index=False)
