Как грамотно получить статью из html документа

e64f

Постоялец
Регистрация
2 Ноя 2008
Сообщения
95
Реакции
6
Добрый день!

В рамках одного научного проекта, для задачи определения тематики текста, понадобилось после получения веб странички очищать ее от html и всяких менюшек, слоганов, реклам, анонсов и прочего, что не имеет отношения к основному тексту страницы. Были следующие идеи:

1) Очищать все HTML теги, функцией strip_tags(), смириться что остается лишний текст.
2) С помощью класса сконвертировать html документ в DOM, выбрать например самый длинный по содержимому тег TD или DIV. Но проблема в том что внутри текста может встретиться DIV и таблица. Также некоторые пытаются засунуть в середину текста рекламу.
3) Перед очисткой от html поудалять подряд стоящие ссылки, так мы уберем меню.
4) Выполнить п.1 для двух страничек сайта, удалить в начале и конце одинаковый текст

Вопрос: может уже есть готовые решения на эту проблему? Подскажите пожалуйста.
 
Вопрос: может уже есть готовые решения на эту проблему? Подскажите пожалуйста.
Конечно же есть готовые варианты =)
1) Написать регулярное выражение, которое содержит какой-либо уникальный элемент до текста статьи и после него... Например:
<div id="content>тут текст без дивов</div>
- соответсвенно выбираем всё между <div id=""content> и </div> - условие может быть сложнее
2) Существует 100500 видов т.н. грабберов, как RSS, так и HTML. Они работают по той же схеме, но регулярку писать вручную не нужно.

Далее тем же strip_tags() чистим от лишнего и готово.
 
Вообще есть довольно хороший класс для парсинга HTML DOM.
Называется - simplehtmldom не знаю, ссылки тут можно или нет выкладывать - рисковать не буду. Ищите в гугл по ключевому слову.

Добавлю:
Контент там вообще просто парсится (вырезка) :
$html = file_get_html('Для просмотра ссылки Войди или Зарегистрируйся

// Find all images
foreach($html->find('img') as $element)
echo $element->src . '<br>';
Если jQuery знаете - это аналог, только под PHP ;)
 
  • Нравится
Реакции: e64f
  • Заблокирован
  • #5
Для просмотра ссылки Войди или Зарегистрируйся

ИЛИ CURL + preg_match
например preg_match('#<span class="file-info-name">([^<]+)&nbsp;</span>#U',$html4,$list2);
echo $list2[1];(Выведет содержимое ([^<]+)
а дальше стандартными методами php делай что хочешь
 
Недавно столкнулся с такой же задачей, решил ее с помощью алгоритма Для просмотра ссылки Войди или Зарегистрируйся.
Я переписал его на свой лад, чтобы использовать на сервере. Но код оставил на javascript, так как алгоритм лаконичен и прост. На пых думаю переписать будет проблемно...
Вот моя версия

 
если заранее известен формат страницы, ну или они из одного сайта, то все очень просто. смотри в сторону phpQuery(или Simple HTML DOM Parser) + cURL + регулярки. Я в парсерах юзаю все. если текст лежит в одном диве на пример <div class="content"> %text% </div> - то с помощью той же пхпКвери можно взять только этот див, почистить его, написать правила для таблиц и тд и тп. Если страничек много, то я бы посоветовал все это закешировать на локальный комп, чтоб не тянуть каждую с инета. Курл поддерживает проксю, её тож желательно юзать, если страниц много.
Короче - дофига "если")) Дайте поконкретней пример, дам поконкретней ответ.
 
  • Заблокирован
  • #8
Здесь интересная статья по теме:
Скрытое содержимое доступно для зарегистрированных пользователей!


в частности:


По просьбам некоторых читателей моих предыдущих статей, я протестировал четыре библиотеки для парсинга HTML-кода:
  • «PHPQuery»
  • «Simple HTML DOM»
  • «Zend DOM Query»
  • «Nokogiri»

Нужно учитывать, что часто HTML-код является невалидным, по-этому для сравнения выбирались только библиотеки, умеющие работать с не валидным кодом.

Лучшая библиотека выбиралась из таких критериев как:
  • Скорость
  • Документация
  • Удобство
  • Надёжность

После прочтения остановился на парсере Nokogiri - все-таки код меньше всего в объеме (около 6 Кб) и самая высокая скорость парсинга. Конечно все это можно сделать регулярками, но это для конкретных монстров кодинга, которым даже переписать винду на ассемблере не за падло.
 
Назад
Сверху