Разбор html может быть сложным и утомительным занятием, но это не обязательно!
Это происходит постоянно в веб-браузерах и может быть выполнено с помощью JavaScript и jQuery. Если вы используете NodeJS, вы можете найти библиотеки htmlparser
или jsdom
для воссоздания dom на вашем сервере. Мы можем использовать эти API для поиска и извлечения информации из DOM.
Что, если нам нужно проанализировать HTML на нашем сервере без NodeJS?
Идея та же, рекомендуется использовать библиотеку парсинга html. Здесь, в Melia Capital, мы запускаем Elixir на наших серверах и используем Floki для синтаксического анализа html.
Floki использует простой подход и представляет каждый элемент HTML как кортеж в рекурсивной структуре, например:
{tag_name, attributes, children_nodes}
Например, узел абзаца может быть представлен как:
{"p", [{"class", "headline"}], ["Floki"]}
В сочетании с мощными возможностями сопоставления шаблонов в Elixir, синтаксический анализ HTML становится простым.
В этом посте мы рассмотрим мой код для анализа данных формы с веб-страницы https://sec.gov/forms.
Зачем нам это нужно?
Мы загружаем и храним все файлы безопасности на наших серверах. Каждая заявка связана с номером формы, но мы мало что знаем об этих формах, а их очень много. Итак, мы хотим загрузить информацию о форме в нашу базу данных. Это позволит нам объединить данные формы с документами, чтобы лучше понять цель регистрации.
Сначала давайте разберемся, с чем мы имеем дело. Мы можем использовать наши инструменты веб-разработчика для проверки веб-страницы и наблюдения за структурой содержимого.
Данные, которые мы хотим извлечь, находятся под этим элементом таблицы.
Мы можем получить тело HTML с помощью Finch.
{:ok, %{body: body}} = Finch.request(Finch.build(:get, "https://www.sec.gov/forms"), __MODULE__)
Теперь с помощью Floki мы анализируем html и находим элементы строки таблицы.
{:ok, html} = Floki.parse_document(body) rows = Floki.find(html, "table.list tbody tr")
Это возвращает список кортежей элементов tr
, содержащих все данные таблицы форм. Первый кортеж должен выглядеть так:
Элемент tr
имеет пять td
children, по одному на каждый столбец таблицы:
- Номер формы
- Описание и ссылка на страницу с деталями формы
- Дата последнего обновления формы
- Номер ТРЦ
- Темы
Давайте напишем функцию для анализа данных, их очистки и возврата в виде структуры карты вместо вложенной структуры кортежа / списка, которая есть у нас сейчас. Для моих целей меня интересуют только количество, описание, URL и темы. Вот код:
Код состоит из трех частей:
- Извлеките данные. Обратите внимание, насколько кратким является код для извлечения данных из структуры списка и кортежа. Сопоставление с образцом - это здорово!
- Очистите данные. Некоторые данные содержат новые строки и пробелы, поэтому мы предпримем некоторые меры для их устранения.
- Возвращаем данные в нужной нам структуре. Я возвращаю карту чистых данных.
Функция выводит следующие структурированные данные:
Удачного кодирования!