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

асс

Мой дом здесь!
Регистрация
13 Окт 2006
Сообщения
762
Реакции
230
Задача такая, есть ключевое слово, для примера- квартира.
Есть ссылка на яндекс.

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


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


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

Какие еще можно заюзать варианты?
Спасибо.
 
Когда-то занимался данным вопросом. Делал на основе анализа тегов. Объясню приблизительно: скрипт разбивал текст на блоки по <div> <table> и т.д. и анализировал текст на "полезность". "Полезность" вычислялась процентным отношением текста к тегам, плюс к полезным тегам относились теги типа <h1-6>, <p> и т.д. Вот как-то по такому принципу. Было это лет несколько назад, поэтому более точнее не скажу, опытным путем можно определить теги и процентное соотношение. Парсер показывал довольно неплохие результаты... точно помню что больше 60%, может быть даже 70-80. Если бы продолжил работать над ним, думаю, получился бы более-менее парсер.
 
...Как можно реализовть такое? Есть вариант PHP Simple HTML DOM Parser...
Забудь это тупиковая ветвь эволюции, на данный момент лучще регулярок еще не чего не придумали...

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

Заголовки в title или в теге H1. Можно еще загружать несколько страниц с этого сайта и в структуре html кода искать различия. Тот блок, где есть различия - есть нужный текст.
 
Выбираем блок, в котором больше всего текста. Этот блок и есть нужный текст статьи. С помощью регулярок, simple html дом или других средеств или другим способом.


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

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>

Самое трудно это разделить по тегам
 
Думал когдато об уникальном парсере, но правда отказался в пользу регулярок.

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

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

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

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

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


И, что более важно, по этим текстам мы довольно точно сможем вычислить границы текста в html, для дальнейшего использования в парсере.

К стати вы очень хорошую мыслю дали, это просто отличная мысль, я как то и не додумался сам.
А ведь реально найти начало текста указав в качестве начала кусок статьи из РСС.

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