Я ранее рассказывал про разные эксперименты в обработке данных, например, про обработку данных в NoSQL базах данных и про экспериментальную библиотеку mongorefine [1].

Когда-то из других экспериментов у меня получилась библиотека по автоматизации извлечения новостей из HTML newsworker [2]. Я её почти не обновлял несколько лет, но это и не требовалось.

А вот про один эксперимент, к я практически не рассказывал, это попытка ответить на вопрос - можно ли работать с HTML как с SQL? Так чтобы не делать запросы через язык запросов xpath или API библиотек парсинга. Но после нескольких прикидок стало очевидно что усилий потребуется много, фактически надо сделать SQL движок с нуля и решить вопрос с тем как данные преобразовать из иерархических в плоскую таблицу.

Зачем вообще это было нужно? В задаче по извлечению новостей которую я решал в библиотеке newsworker одной из внутренних задач была кластеризация тегов. Метод который я использовал для кластеризации предполагал сбор о каждом теге дополнительных данных, которых нет в содержании HTML страницы. Это данные о позиции тега внутри родительского тега и о глубине тега относительно корневого тега. В целом это решалось относительно просто за счёт того что в библиотеке newsworker кластеризация шла по тегам отмеченным как содержащие даты, а таких на веб страницах редко более 100.

Тем не менее той задачей всё это не ограничивалось и идея с тем что можно работать с HTML как данными меня не покидала. В другом эксперименте я попробовал преобразовывать HTML в плоский Pandas DataFrame. Всё таки DataFrame - это почти как SQL, а может и лучше и удобнее. Как при этом решить перевод иерархических данных в плоские? Собираем все атрибуты тегов, разворачиваем их в колонки и для всех тегов заполняем таблицу где если атрибута нет то у него нулевое значение в ячейке.

С точки зрения удобства технического анализа - это очень удобно. Плоская таблица, можно делать запросы простым образом, они обрабатываются быстрее. С точки зрения эффективности работы с памятью - это, конечно, не так хорошо. Размер DataFrame от 7 до 21 раза превышает объём оригинальной веб-страницы. Конечно это именно из-за большого числа пустых колонок в получающейся таблице. Собственно поэтому я код этого эксперимента так и не опубликовал, раздумывая над тем как можно, или придумать другой способ делать быстрые запросы к дереву тегов, или как сжимать пространство атрибутов к тегам с сохранением эффективности запросов.

Наверное, в какой-то момент когда у меня будет больше свободного времени и готовность дописать документацию я смогу показать что получается.

Но в целом я хотел рассказать про этот эксперимент как иллюстрацию подхода к созданию чего-то нового по принципу "А давайте возьмём вот это с нестандартным интерфейсом и приделаем один из стандартных?". Идей для такого множество, какие-то совершенно некоммерческие, другие могут иметь разные формы применения.
Например։
- работа с почтовыми ящиками как с SQL или NoSQL базами данных. Есть несколько продуктов превращающих IMAP/POP3 ящики в REST API, что тоже даёт возможности для интеграции в Modern Data Stack, но можно ещё больше
- универсальные API для работы с любыми документами разметки. Из того что есть в открытом коде к этому более всего приближается unstructured [3], дающий одинаковые инструменты для разбора PDF, DOCX, HTML и электронных писем.

И ещё очень многое упрощающее интеграцию того что можно отнести к унаследованным протоколам, форматам и стандартам работы к тем что лучше интегрируются с новыми продуктами.

Ссылки։
[1] https://medium.com/@ibegtin/nosql-data-wrangling-50b5a2898a83
[2] https://github.com/ivbeg/newsworker
[3] https://github.com/Unstructured-IO/unstructured

#datatools #opensource #experiments