Как парсить HTML-таблицы с помощью библиотеки Python Pandas

Table Of Content
- Сбор данных
- Готовый код, который использует функцию read_html() библиотеки Python Pandas
- Извлечение всех таблиц
- Группировка всех извлеченных таблиц в одну таблицу
- Очистка DataFrame
- Сохранение Dataframe
- Резюме
- Связанные статьи
- Парсинг данных с вложенных HTML-страниц с помощью Selenium в Python
- Как извлечь таблицы из PDF с помощью Python Pandas и tabula-py
- Быстрый и готовый скрипт для извлечения повторяющихся таблиц из PDF
- Как загрузить содержимое документа Google в Python
- Три трюка для ускорения и оптимизации вашего Python
- Обзор трех трюков Python, которые я открыл в своих чтениях в июне.
Сбор данных
Готовый код, который использует функцию read_html() библиотеки Python Pandas
Почти все ученые-данные, работающие в Python, знают библиотеку Pandas, и почти все они знают функцию read_csv(). Однако только немногие из них знают функцию read_html().
Функция read_html() позволяет извлекать таблицы, содержащиеся в HTML-страницах, очень быстро. Базовая версия этой функции извлекает все таблицы, содержащиеся на HTML-странице, в то время как использование некоторых конкретных параметров позволяет извлекать очень конкретную таблицу.
В этом руководстве я сосредоточусь на следующей HTML-странице, содержащей группы футбольного соревнования Euro 2020:
Каждая таблица имеет следующую HTML-структуру:
<table class="table"> <thead>
<tr>
<th title="Field #1"></th>
<th title="Field #2">P</th>
<th title="Field #3">+/-</th>
<th title="Field #4">Pts</th>
</tr>
</thead> <tbody>
<tr>
<td><span>1</span> </span>ITA</span> <span>Italy</span></td
<td>3</td>
<td>7</td>
<td>9</td>
</tr>
<tr>
...
</tr>
<tr>
...
</tr>
<tr>
...
</tr>
</tbody>
</table>Извлечение всех таблиц
На веб-сайте UEFA содержится 6 таблиц, по одной для каждой группы (A-F). Я могу извлечь все таблицы, просто передав путь к функции read_html().
import pandas as pd
df_list = pd.read_html("source/euro2020_groups.html")Функция возвращает список, содержащий 6 таблиц данных, по одной для каждой группы. Например, df_list[0] содержит первую таблицу:
Все таблицы имеют одинаковую структуру. Я замечаю, что первый столбец Unnamed: 0 не был распознан правильно. Таким образом, требуется процесс очистки.
Группировка всех извлеченных таблиц в одну таблицу
Теперь я группирую все извлеченные таблицы в одну таблицу. Чтобы сохранить различия между таблицами, мне нужно добавить новый столбец, в котором будет храниться группа, к которой принадлежит каждая запись.
Я определяю список, содержащий все группы (A-F):
import string
N = len(df_list)
groups_names = list(string.ascii_uppercase[0:N])Переменная groups_names содержит следующие значения:
['A', 'B', 'C', 'D', 'E', 'F']Теперь я группирую все фреймы данных с помощью функции append(). Сначала я определяю пустой фрейм данных, а затем добавляю в него все фреймы данных, содержащиеся в переменной df_list. Контекстно я также добавляю столбец Group, который указывает группу, к которой принадлежит каждая запись:
df = pd.DataFrame()
for i in range(0, N):
group_col = [groups_names[i]] * len(df_list[i])
df_list[i]['Group'] = group_col
df = df.append(df_list[i])Теперь фрейм данных df выглядит следующей таблицей:
Очистка DataFrame
DataFrame df выглядит немного грязным: на самом деле, столбец Unnamed: 0 неправильный. Сначала я переименовываю его в Team:
df.rename(columns={"Unnamed: 0": "Team"}, inplace=True)а затем я расширяю столбец Team, разделяя его на несколько столбцов:
df_new = df['Team'].str.split(' ',expand=True)DataFrame df_new выглядит следующим образом:
Интересными являются только столбцы 0, 1 и 2. Поэтому я выбираю их и присваиваю новым столбцам в моем исходном DataFrame df:
df[['N', 'ID', 'Country']] = df_new[[0,1,2]]Я могу удалить исходный столбец Team:
df.drop(['Team'], axis=1, inplace=True)DataFrame df выглядит следующим образом:
Таблица правильная, но порядок столбцов неправильный. Мне нужно переместить столбец Group в первую очередь, затем N, ID, Country и, наконец, оставшиеся столбцы. Я могу изменить порядок столбцов с помощью функции reindex(), которая принимает в качестве входных данных точный порядок столбцов:
df = df.reindex(columns=['Group','N', 'ID', 'Country', 'P', '+/-', 'Pts'])DataFrame df выглядит следующим образом:
Сохранение Dataframe
Теперь я могу сохранить dataframe в виде CSV файла:
df.to_csv('euro_2020_groups.csv')Резюме
В этом руководстве я показал простой механизм извлечения таблиц из HTML-страниц с помощью Python Pandas. Это можно сделать с помощью функции read_html(), которая очень проста и быстра. В большинстве случаев полученные таблицы требуют некоторой очистки.
Функция read_html() также предоставляет интересный параметр match, который можно использовать для извлечения конкретных таблиц из сложной HTML-страницы. Оставайтесь на связи, если вы хотите углубиться в этот параметр :)
Весь код, объясненный в этой статье, можно скачать из моего репозитория на Github в виде Jupyter Notebook.
Если вы хотите быть в курсе моих исследований и других активностей, вы можете следить за мной в Twitter, Youtube и Github.
Связанные статьи
Парсинг данных с вложенных HTML-страниц с помощью Selenium в Python
towardsdatascience.com
Как извлечь таблицы из PDF с помощью Python Pandas и tabula-py
Быстрый и готовый скрипт для извлечения повторяющихся таблиц из PDF
towardsdatascience.com
Как загрузить содержимое документа Google в Python
towardsdatascience.com
Три трюка для ускорения и оптимизации вашего Python
Обзор трех трюков Python, которые я открыл в своих чтениях в июне.
towardsdatascience.com
