Как парсить 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