CoderCastrov logo
CoderCastrov
Питон

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

Как парсить HTML-таблицы с помощью библиотеки Python Pandas
просмотров
4 мин чтение
#Питон

Сбор данных

Готовый код, который использует функцию read_html() библиотеки Python Pandas

Почти все ученые-данные, работающие в Python, знают библиотеку Pandas, и почти все они знают функцию read_csv(). Однако только немногие из них знают функцию read_html().

Функция read_html() позволяет извлекать таблицы, содержащиеся в HTML-страницах, очень быстро. Базовая версия этой функции извлекает все таблицы, содержащиеся на HTML-странице, в то время как использование некоторых конкретных параметров позволяет извлекать очень конкретную таблицу.

В этом руководстве я сосредоточусь на следующей HTML-странице, содержащей группы футбольного соревнования Euro 2020:

Image by Author

Каждая таблица имеет следующую 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] содержит первую таблицу:

Image by Author

Все таблицы имеют одинаковую структуру. Я замечаю, что первый столбец 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 выглядит следующей таблицей:

Image by Author

Очистка 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 выглядит следующим образом:

Image by Author

Интересными являются только столбцы 0, 1 и 2. Поэтому я выбираю их и присваиваю новым столбцам в моем исходном DataFrame df:

df[['N', 'ID', 'Country']] = df_new[[0,1,2]]

Я могу удалить исходный столбец Team:

df.drop(['Team'], axis=1, inplace=True)

DataFrame df выглядит следующим образом:

Image by Author

Таблица правильная, но порядок столбцов неправильный. Мне нужно переместить столбец Group в первую очередь, затем N, ID, Country и, наконец, оставшиеся столбцы. Я могу изменить порядок столбцов с помощью функции reindex(), которая принимает в качестве входных данных точный порядок столбцов:

df = df.reindex(columns=['Group','N', 'ID', 'Country', 'P', '+/-', 'Pts'])

DataFrame df выглядит следующим образом:

Image by Author

Сохранение 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