Как сделать универсальный парсер?

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

  1. асс

    асс

    Регистр.:
    13 окт 2006
    Сообщения:
    756
    Симпатии:
    221
    Задача такая, есть ключевое слово, для примера- квартира.
    Есть ссылка на яндекс.

    Скрипт должен по ключевому слову выбрать ссылки с яндекса на полные статьи и спарсить их.


    Привязки к регуляркам и вырезания по тегам быть не должно.


    Как можно реализовть такое? Есть вариант PHP Simple HTML DOM Parser

    Какие еще можно заюзать варианты?
    Спасибо.
     
  2. SkiLLer

    SkiLLer

    Регистр.:
    22 авг 2007
    Сообщения:
    307
    Симпатии:
    64
    Когда-то занимался данным вопросом. Делал на основе анализа тегов. Объясню приблизительно: скрипт разбивал текст на блоки по <div> <table> и т.д. и анализировал текст на "полезность". "Полезность" вычислялась процентным отношением текста к тегам, плюс к полезным тегам относились теги типа <h1-6>, <p> и т.д. Вот как-то по такому принципу. Было это лет несколько назад, поэтому более точнее не скажу, опытным путем можно определить теги и процентное соотношение. Парсер показывал довольно неплохие результаты... точно помню что больше 60%, может быть даже 70-80. Если бы продолжил работать над ним, думаю, получился бы более-менее парсер.
     
  3. trooll

    trooll PHP кодер

    Регистр.:
    22 дек 2008
    Сообщения:
    503
    Симпатии:
    116
    Забудь это тупиковая ветвь эволюции, на данный момент лучще регулярок еще не чего не придумали...

    Вообще универсальные парсеры это бред, но в теории это выглядит как то так:
    Переходишь на сайт, ищешь на сайте несколько одинаковых страниц по структуре. К примеру в раздел статей или новостей, с них загружаешь несколько новостей / статей загружаешь их. Анализируешь полученные страницы, отсекаешь одинаковые / похожие блоки кода. Дальше нормализуешь остаток, удаляешь к примеру все теги, куски JS, CSS и т. п. что не может являться текстом на странице. Ну вот и тут как бы ты уже получаешь текст статьи. Это примерный алгоритм и не идеальный но смысл я думаю до тебя до нес.
     
    lift и latteo нравится это.
  4. dandandan

    dandandan

    Регистр.:
    7 авг 2008
    Сообщения:
    991
    Симпатии:
    267
    Выбираем блок, в котором больше всего текста. Этот блок и есть нужный текст статьи. С помощью регулярок, simple html дом или других средеств или другим способом.

    Заголовки в title или в теге H1. Можно еще загружать несколько страниц с этого сайта и в структуре html кода искать различия. Тот блок, где есть различия - есть нужный текст.
     
  5. асс

    асс

    Регистр.:
    13 окт 2006
    Сообщения:
    756
    Симпатии:
    221

    Ну тут это да, я вот щас написал правда из 5 сайтов попадается немного мусора.
    но это регулярками и без привязки к конкретным тегам, я в принципе очищаю сначала весь шлак, теги ссылки и прочую лабуду, а потом уже выбираю блоки с текстом и отсеиваю те что менее 500 знаков, только как брать заголовки, хотя в большинстве своем заголовок сидит в title.
     
  6. асс

    асс

    Регистр.:
    13 окт 2006
    Сообщения:
    756
    Симпатии:
    221
    По сути надо делать следующее.

    1 удалить весь шлак скрипты фреймы коментарии кода, не нужные теги, оставить только p div table
    2) Разбить все теги по открывающему и закрывающему,
    как мне кажется это сложнее всего/
    3) Разбив теги ищем в них текст и подсчитываем количество букв, символов, и если оно меньше заданного нам, то удаляем нафиг.


    я вот никак не вкурю как мне разделить по тегам.

    тут походу надо брать сначала внешние и рекурсивно удалять приближаясь в нутрь.
    нарпимер структура документа

    <table> <div> </div> <div> <div> <div> <div><i><i> </div> <div><div> </div> </div> </table> <div> </div> <div> <div> <div> <div><i><i> </div> <div><div> </div> </div> <table> </table> <table> <div> </div> <div> <div> <div> <div><i><i> </div> <div><div> </div> </div> <table>


    Самое трудно это разделить по тегам
     
  7. dazed

    dazed

    Регистр.:
    31 мар 2007
    Сообщения:
    208
    Симпатии:
    55
    Думал когдато об уникальном парсере, но правда отказался в пользу регулярок.

    В общем некоторые моменты здесь озвучили, допишу свои:

    1. Наподобие как сказал dandandan, по title можно узнать заголовок статьи. Его же ищем в тексте с самым больших вхождением слов. Это будет начало статьи.
    2. Статью можно искать где больше чистого текста с минимальным количеством html кода. Там обычно встречаются только теги <b>,<a>, <i>, <strong> и прочее..но есть допустимые если закрытые внутри теги, к примеру могут встречаться таблицы, или еще реже <div> к примеру оформлением цитат или информации об авторе.

    В общем очень тяжелый метод написания, сколько не дорабатывать всеравно будут сайты выбивающиеся из колее и будет их довольно большой процент. Хоть уменьшать его можно, но чем дальше тем сложнее будет.
     
  8. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.521
    Симпатии:
    1.370
    Очень интересна данная тема.

    Первая задумка аналогична тому что предлагает trooll - анализ нескольких страниц для выявления шаблона.

    Вторая:
    1. В <head> ищем что-типа <link rel="alternate" title="IT happens RSS" href="Перейти по ссылке" type="application/rss+xml"> - может быть и другой формат записи.
    Так же ищем в документе ссылки содержащие rss.
    2. Загружаем, проверяем или это таки RSS.
    3. Если нам повезло мы имеем текст нескольких десятков/сотен статей.
    И, что более важно, по этим текстам мы довольно точно сможем вычислить границы текста в html, для дальнейшего использования в парсере.
    4. Как дополнительная валидация проверяем, что то что мы нашли является наиболее длинным отрезком текста.
     
    lift и асс нравится это.
  9. mcdir

    mcdir

    Регистр.:
    6 ноя 2007
    Сообщения:
    202
    Симпатии:
    37

    0 нереализуемо
    1 или задача для ИИ
    2 или посадить джамшута который будет и капчу яндекса вводить и прокси постоянно менять и контент без регулярки парсить
     
    Extalionez нравится это.
  10. асс

    асс

    Регистр.:
    13 окт 2006
    Сообщения:
    756
    Симпатии:
    221
    К стати вы очень хорошую мыслю дали, это просто отличная мысль, я как то и не додумался сам.
    А ведь реально найти начало текста указав в качестве начала кусок статьи из РСС.

    К стати еще как вариант опускаем все кроме русских букв и знаков препинания, далее считаем количество знаков и
    забираем те где больше всего текста, но опять же может попадаться мусор.