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

Тема в разделе "Как сделать...", создана пользователем e64f, 22 ноя 2012.

  1. e64f

    e64f Постоялец

    Регистр.:
    2 ноя 2008
    Сообщения:
    95
    Симпатии:
    6
    Добрый день!

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

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

    Вопрос: может уже есть готовые решения на эту проблему? Подскажите пожалуйста.
     
  2. Горбушка

    Горбушка Ищу её...

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

    Далее тем же strip_tags() чистим от лишнего и готово.
     
  3. denik

    denik Постоялец

    Регистр.:
    1 июл 2011
    Сообщения:
    79
    Симпатии:
    43
    Вообще есть довольно хороший класс для парсинга HTML DOM.
    Называется - simplehtmldom не знаю, ссылки тут можно или нет выкладывать - рисковать не буду. Ищите в гугл по ключевому слову.

    Добавлю:
    Контент там вообще просто парсится (вырезка) :
    Если jQuery знаете - это аналог, только под PHP ;)
     
    e64f нравится это.
  4. e64f

    e64f Постоялец

    Регистр.:
    2 ноя 2008
    Сообщения:
    95
    Симпатии:
    6
    Можно пример грабера
     
  5. DeviLlundead

    DeviLlundead Писатель

    Заблокирован
    Регистр.:
    31 июл 2011
    Сообщения:
    10
    Симпатии:
    15
    PHP Simple HTML DOM Parser

    ИЛИ CURL + preg_match
    например preg_match('#<span class="file-info-name">([^<]+)&nbsp;</span>#U',$html4,$list2);
    echo $list2[1];(Выведет содержимое ([^<]+)
    а дальше стандартными методами php делай что хочешь
     
  6. recasher2k12

    recasher2k12

    Регистр.:
    19 фев 2012
    Сообщения:
    156
    Симпатии:
    78
    Недавно столкнулся с такой же задачей, решил ее с помощью алгоритма readability.
    Я переписал его на свой лад, чтобы использовать на сервере. Но код оставил на javascript, так как алгоритм лаконичен и прост. На пых думаю переписать будет проблемно...
    Вот моя версия

     
  7. cjcat

    cjcat Создатель

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

    Ranger_Hunter Постоялец

    Заблокирован
    Регистр.:
    20 апр 2009
    Сообщения:
    127
    Симпатии:
    48
    Здесь интересная статья по теме:


    в частности:


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