Разбор 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 имеет пять tdchildren, по одному на каждый столбец таблицы:

  1. Номер формы
  2. Описание и ссылка на страницу с деталями формы
  3. Дата последнего обновления формы
  4. Номер ТРЦ
  5. Темы

Давайте напишем функцию для анализа данных, их очистки и возврата в виде структуры карты вместо вложенной структуры кортежа / списка, которая есть у нас сейчас. Для моих целей меня интересуют только количество, описание, URL и темы. Вот код:

Код состоит из трех частей:

  1. Извлеките данные. Обратите внимание, насколько кратким является код для извлечения данных из структуры списка и кортежа. Сопоставление с образцом - это здорово!
  2. Очистите данные. Некоторые данные содержат новые строки и пробелы, поэтому мы предпримем некоторые меры для их устранения.
  3. Возвращаем данные в нужной нам структуре. Я возвращаю карту чистых данных.

Функция выводит следующие структурированные данные:

Удачного кодирования!