В этой статье мы расскажем о том, как столкнулись с проблемой, когда исходные данные оформлены в виде текста, не предполагаемого для работы с табличными процессорами, да еще и разбиты на много отдельных файлов, и как ее решили с помощью Python и его модулей.
В наше время все крупные организации (в особенности, работающие в розничной сфере бизнеса) владеют огромным массивом структурированной информации в виде баз данных, электронных таблиц и т.п. В них содержится история развития организации и ее взаимодействия с клиентами: различная контактная информация, совершенные транзакции, осуществленные активности работников, плановые показатели, технические логи т.д. и т.п.
Для специалиста не составляет труда провести анализ того или иного массива информации, открыв его в табличном редакторе либо сформировав прямой запрос в БД по условиям выборки. Но на практике, аналитики данных нередко встречают задачи по структурированию нетабличных текстовых данных, в т.ч. имеющих их табличное отображение, основанное на коде разметки веб-страниц, но не являющимися таблицами в полном смысле этого слова (html, htm и т.п.). Именно с таким видом представления некоторых ежедневных форм нетабличных отчетных данных мы столкнулись в своей работе. О том как мы решили подобную задачу, параллельно знакомясь с технологией парсинга, расскажем в этой статье.
Для начала предлагаем разобраться в объекте исследования — веб странице и ее коде разметки.
Рассмотрим пример таблицы в формате html:
Код гипертекстовой разметки данной таблицы будет выглядеть так:
Из кода видно, что за структуру таблицы в HTML отвечают так называемые тэги:
<table></table> - ограничивающие собой саму таблицу;
<tr></tr> - ограничивающие собой строки таблицы
<td></td> - ограничивающие собой ячейки строк
Теперь перед нами возникает задача: как привести этот закодированный текст в удобный нам табличный вид? И как это сделать если таких файлов формируется десятки (сотни) в день, а анализировать нам надо месяцы (или даже годы)? Здесь нам на помощь приходит Python и его модуль парсера “BS4 (beautifulsoup4)”.
Для успешного решения этой задачи нам потребуется передать для анализа в модуль BS4 Python таблицу ограниченную тегами <table>, предварительно внедрив в код сам модуль:
Сначала следует часть типового решения Python по работе с файлом: интересующий нас файл открывается Python, “зачитывается” полностью в переменную и передается модулю bs4.
Следующим этапом следует определение самой таблицы в общей массе кода по тегу <Table> и сведение всех ячеек в один список.
Сформированный общий список значений всех ячеек нам надо вернуть по строкам
Теперь полученный словарь с данными таблицы мы можем с уверенностью подвергнуть анализу как средствами самого Python так и экспортировать в файл, например, в формат csv.
В конечном итоге мы получаем текстовый файл формата csv с разделителями, позволяющий нам экспортировать данные в любой табличный редактор или базу данных.
Указанный вариант реализации парсинга текстовых отчетов описан в упрощенном виде. Нами он успешно используется при импорте ежедневных текстовых отчетов за период путем дополнительной организации циклов поочередного чтения файлов самим модулем по настройкам вида и структуры отчетов.