https://github.com/spumer/tenzor-test
Тестовое задание для компании Tenzor. Универсальный парсер контента, как правило нацеленный на новостные сайты.
https://github.com/spumer/tenzor-test
Last synced: 28 days ago
JSON representation
Тестовое задание для компании Tenzor. Универсальный парсер контента, как правило нацеленный на новостные сайты.
- Host: GitHub
- URL: https://github.com/spumer/tenzor-test
- Owner: spumer
- License: gpl-3.0
- Created: 2013-08-07T06:27:08.000Z (almost 13 years ago)
- Default Branch: master
- Last Pushed: 2013-08-09T08:00:37.000Z (almost 13 years ago)
- Last Synced: 2025-07-13T02:03:07.775Z (12 months ago)
- Language: C
- Size: 215 KB
- Stars: 1
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
tenzor-test
===========
Тестовое задание для компании Tenzor. Универсальный парсер контента, как правило нацеленный на новостные сайты.
$ gcc -std=c99 -c trim.c
$ g++ trim.o main.cpp -static-libgcc -std=c++11 -lstdc++ -lcurl -lxml2 -O2 -ffast-math -mfpmath=sse -fschedule-insns -fsched-pressure
**Краткое описание.**
За основу для алгоритма был взят популярный способ разметки сайтов: наличие блочного тега, содержимое которого оборачивается в строчные. На практике это выглядит след. образом: блочный тег <div>, строчные тег(и) <p>, <b>, <a> и т.д.
Дополнительным критерием оценки содержимого служит наличие ссылок, однако, вместо подсчета кол-ва ссылок ведется подсчет байт, которые они занимают. Тем самым позволяя обходить ленты новостей вида <a href="link to the page">Длинное название новости, почти краткое описание</a><a ...>Еще одна новость</a>
**Принцип работы.**
Первым делом инициализируется список блочных/управляющих и строчных/дополнительных тегов. Анализ документа производится с помощью сторонней библиотеки libxml2, которой передается всего три callback'a: начало тега, получение данных, конец тега.
Для определения в любой момент времени имени тега, с которым идет работа, оно помещается в стек(m_levelStack) при входе в тело тега и извлекается при выходе.
Результатом работы программы является список блочных тегов, из которого затем выбирается элемент с наибольшим размером.
Когда обработчику встречается блочный тег, создается соответствующий объект типа Node и помещается в стек для временных объектов (m_parentStack) это позволяет сохранить порядок вложенности тегов, на случай если блочный тег вложен в блочный.
Далее, при обработке строчных тегов их содержимое добавляется к предыдущему блочному тегу, уникальное поведение создано для ссылок: длина содержимого ссылки записывается в специальное значение m_Links, дабы в дальнейшем вычесть его из общего размера тега и тем самым свести к минимум влияние ссылок на основной контент.
Содержимое тегов не указанных ни в одном из списков игнорируется.
В дополнение к основному фильтру, при добавлении контента происходит проверка глубины вложенности. Так, к примеру, тег оказавшийся слишком глубоко, за чередой неизвестных тегов будет проигнорирован. Подобное поведение присуще разного рода меню и лентам. Уровень вложенности изменяется только тегами, которых нет ни в одном из списков.
После выхода из блочного тега, проверяется размер его содержимого. Пустые блочные теги уничтожаются. Остальные добавляются к результатам выборки.
**Дальнейшее развитие.**
Выделение "словаря" тегов во внешний источник, поддержка дополнительных списков для разных сайтов, имеющих отклонения в разметке.
Проверка типа контента по ссылке, игнорирование изображений, видео и прочего.
Ведение лога своих действий в любой из приемников: master-server, файл, субд.
Исправление допущений в коде, ошибок.