CoderCastrov logo
CoderCastrov
Парсер

Как считывать таблицы HTML с помощью pandas

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

Представьте себе, что вы ищете данные, которые затем будете обрабатывать в Python, и именно те данные, которые вам нужны, вы находите в таблице на странице Википедии, например. Что вы делаете? Копируете и вставляете их в Excel, а затем читаете этот файл с помощью Python? Используете Beautiful Soup для поиска HTML-тега таблицы, которую вам нужно, а затем передаете данные в dataframe в pandas? Создаете dataframe вручную? Вы могли бы... Но есть более эффективное решение.

Я нашел этот твит Криса Моффитта, который объясняет, как считывать таблицы HTML с помощью pandas, и так как на русском языке ничего подобного не было, я решил написать этот мини-учебник.

Чтение HTML-таблицы

Для начала необходимо импортировать библиотеку pandas и иметь URL-адрес страницы с таблицей, которую мы хотим прочитать в pandas. В данном случае я буду использовать статью из Википедии Список стран по уровню инфляции.

После того, как у нас есть все необходимое, мы можем начать просматривать количество таблиц на странице и выводить первые строки каждой таблицы.

ВНИМАНИЕ! Если вы запускаете код на MacOS и получаете следующую ошибку, рекомендуется следовать этим инструкциям для ее устранения.

urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:833)>

Выбор таблицы для работы

Теперь, когда мы уже определили таблицу, с которой хотим работать (таблица номер 2), нужно выбрать ее и преобразовать в объект dataframe из библиотеки pandas. Мы также можем изучать характеристики dataframe: количество строк и столбцов, типы столбцов и т. д.

Если мы выведем в консоль первые строки dataframe, получим:

  Страна / Территория   Уровень инфляции   Дата информации
0             Андорра             -0.9              2015 г.
1                Чад             -0.9              2017 г.
2        Саудовская Аравия             -0.9              2017 г.
3                Того             -0.7              2017 г.
4      Американское Самоа             -0.5              2015 г.

Dataframe имеет 227 строк и 3 столбца (227, 3). Общие характеристики dataframe:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 227 entries, 0 to 226
Data columns (total 3 columns):
Страна / Территория                     **227 non-null object**
Уровень инфляции                          **227 non-null object**
Дата информации                     **227 non-null object**
dtypes: object(3)
memory usage: 5.4+ KB
None

Нам нужно немного очистить данные... В частности, нужно преобразовать столбец с уровнем инфляции в числовые значения и удалить слово "г." из последнего столбца, который показывает даты.

В общих чертах, то, что делает этот for loop для столбца с уровнем инфляции, это считывает каждое значение столбца, определяет, есть ли отрицательный знак, заменяет его на соответствующий и затем добавляет очищенное значение в список, который присваивается столбцу инфляции.

Аналогичные действия выполняются с столбцом годов. Мы удаляем "г." из каждого значения, а затем удаляем любые нецифровые символы, которые могут остаться в оставшейся части.

Очищенный DataFrame

После выполнения этих шагов, у нас есть готовый для работы и более глубокого анализа DataFrame. Поскольку это не является целью данной статьи, я не буду углубляться в детали анализа, но мы можем быстро посмотреть, какие страны имеют наименьшую и наибольшую инфляцию.

Сначала мы сортируем DataFrame по значениям инфляции от наименьшей к наибольшей, а затем создаем два DataFrame. Первый содержит 10 стран с наименьшими уровнями инфляции:

  Страна / Территория    Уровень инфляции    Дата информации
0             Андорра              -0.9                   2015
1                Чад              -0.9                   2017
2        Саудовская Аравия              -0.9                   2017
3                Того              -0.7                   2017
4      Американское Самоа              -0.5                   2015
5       Лихтенштейн              -0.4                   2016
6     Соломоновы острова              -0.4                   2017
7       Фарерские острова              -0.3                   2016
8               Аруба              -0.1                   2017
9              Бруней              -0.1                   2017

Второй DataFrame содержит 10 стран с наивысшими уровнями инфляции:

    Страна / Территория    Уровень инфляции    Дата информации
217               Сирия              25.5                   2017
218                Иран              26.0                   2020
219               Ливия              28.0                   2017
220              Ангола              31.7                   2017
221               Судан              32.4                   2017
222    Конго, Дем. Респ.              41.5                   2017
223         Южный Судан              48.0                   2019
224           Аргентина              54.8                   2020
225            Зимбабве             161.8                   2019
226           Венесуэла          200000.0                   2020

Другие вещи, которые можно сделать, включают создание столбчатых диаграмм для лучшего сравнения уровней инфляции между странами, объединение данных из этой таблицы с данными из другой и просмотр того, как менялся уровень инфляции в последние годы, какая страна смогла снизить свою инфляцию, а какая нет, и т.д.

Вы можете найти весь репозиторий здесь.