| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > JavaScript: Общие вопросы > Сделать парсер-генератор кода страницы |
| Автор: 12345c 18.8.2006, 20:41 | ||||
Появилась идея сделать механизм, автоматизирующий вытаскивание полезной информации из html. Скажем, имеем мы в описании справочника очень похожие структуры данных вида
Есть задача вытащить всю полезную информацию, по ходу игнорируя лишние пробелы и переносы. Превратить всё в упорядоченный поток вида
|
| Автор: JSman 22.8.2006, 23:57 |
| есть объекты FSO и др. с ними можно генерить новую страницу через JS. тебе нужно проходить по дереву, "правильно" собирать innerText каждого тэга. а свойства тэга можно получить for in. а в чем, собственно, сложности? регулярные выражения могут даже не понадобиться. если хочешь делать без Delphi и др., то простой и удобный вариант на HTA. но опять же, ты встретишься с утечкой памяти и косяками JS |
| Автор: 12345c 23.8.2006, 19:26 |
| FSO не надо, потому что часть декодирования должна работать везде, как обычный компонент скрипта. Вопрос в том, чтобы наглядно описывать выбрасываемые части страницы и сделать достаточно общее решение, чтобы встраивать его. Кодирующую часть делать всё равно на чём, но лучше на кросссистемных скриптах. JS вполне способен это осилить. Важно, чтобы потом поменьше программировать. Может, пойти от конца - создания шаблона? Берём образец страницы, заменяем в ней поля переменных на вставки переменных типа <...> или <span class=...>, вставляем учитываем возможность пробелов и переносов где угодно - и вперёд. |
| Автор: JSman 23.8.2006, 23:36 |
| хорошо, можно образец сунуть в переменную и использовать в скрипте. понятно. я думаю, что стоит определиться с форматом шаблона для облегчения поиска с использованием RegExp. !TAGNAME! [ attr = ... ; ... ] но тут возникает вопрос: полезная информация - эта та информация, без использования лишних тэгов и атрибутов типа STYLE? имеет ли смысл придумывать новый формат для последующего создания той же страницы только без мусора? а говоря о кроссбраузерности, то мне кажется, что лучшим решением будет генерить сценарий, содержащий в себе массив, состоящий из дочерних массивов. var IMG = [["SRC","значение"],["ALIGN", "top"] ]; очень легко оттуда извлекать информацию и записывать. |
| Автор: 12345c 24.8.2006, 00:30 |
| Да, это вся сухая информация без украшений и тегов, которую потом в новой генерации страницы оформим по-своему. Это автоматизированный извлекатель информации с группы похожих страниц или из одной большой с повторяющимися элементами. К массиву я тоже прихожу, но ещё более эффективно хранить в строке или столбике, где переносы строк вместо запятых, а кавычки отсутствуют. Потом её легко переводим в многомерный массив. |
| Автор: Sardar 24.8.2006, 13:27 |
| 12345c, не понял в чём вопрос... Собрать документ по шаблону с файла что ты привёл есть дело 10 минут кодинга на PHP. Обраное преобразование (с целого документа в инфу) потребуеться знание шаблона, что тоже просто если перед парсингом шаблон известен. Другой вопрос: а нафига? ты .htm документы справочника в что то другое конвертишь или индексы делаешь? |
| Автор: 12345c 24.8.2006, 18:04 |
| Вопроса насущного нет, есть желание выработать методы, алгоритмы преобразований и достаточно наглядное представление шаблонов. Чтобы не кодировать каждый раз заново, а пользоваться методами. Обратная задача (извлечение инф-ы из разметки) нужна, чтобы доставать инф-у из разных htm-страниц, утяжелённая вольностью ручной кодировки этих страниц разными авторами и верстальщиками. Тоже нужен набор методов, чтобы применять при таком подходе, для автоматизации процесса и для перевода информации в своё представление, со своей разметкой. Задача пригодится и при парсинге веб-контента для разных целей. Конечно, предполагаю решение её полуавтоматическим, в диалоге с человеком, который показывает существенное и правила вольностей верстальщиков, а автомат несётся дальше, до следующего места непонимания. Вчера, например, по задаче синтеза html придумал такую вещь, как встраивание кода в шаблон, чтобы потом его исполнять в циклах по eval(). |
| Автор: JSman 25.8.2006, 00:13 |
| довольно странно... если мы видим банеры, то работаем с IMG или IFRAME. а так вся разборка текста идет по P, DIV, SPAN, ну списки и прочее в том же духе. и то SPAN нужен, в принципе, только для указания стиля. DIV тоже спорный вариант - украшательства через прямоугольники... тогда это все наводит на мысль: причем тут "супер разум"? по-моему цель должна сводится к выделению контента без банеров, где текст классически состоит из P, BR, SPAN, A, списков, элементов управления.. по-моему красота проги будет в разграничении HTML, CSS, JSCRIPT.. управление отображением содержимого - через CLASS. новый формат не нужен... нужно просто очистить контент от изображений маленького размера, ссылающихся на другой хост, убрать украшательства и поставить вместо них CLASS в тэге STYLE и присодинять события по ONLOAD в отдельном скрипте. говоря о сказанном выше, красота декодирования не нужна особенно в JSCRIPT .. мы сразу сформируем основу. от нее отталкиваемся и меняем стиль содержимого через CSS. даже массив со своей многомерностью не нужен. если я прав, то деятельность сведется лишь к кодированию на JSCRIPT нового контента без вольностей опять же через FSO и вообще HTA. |
| Автор: Sardar 25.8.2006, 01:33 | ||||||
Он может ответить на вопрос: что тебе нужно Если мне нужна инфа, то я примерно понимаю как выглядит эта инфа, следовательно пишеться по быстрому анализатор первого типа, либо в редких случаях анализатор второго типа. Повторяю: ты знаешь какую инфу ты хочешь получить и как её достать, ты не отдаёшь "выделение" на откуп софту.
К сожалению не всё в вебе оформлено в виде офисных документов, чаще свёрстано на таблицах с жуткими заморочками. Поисковики ориентируються на количество текста для индексации. Ещё картинки ассоциируються с рядом стоящим текстом, так ты можешь "искать картинки".
Это простой анализатор, в DOM дереве всё раздельно. А вот написать конвертор любой кривой вёрстки в красивую структуру со стилями, да так что визуально во всех браузерах будет одинакого и не отличаться от оригинала... не, памятник при жизни точно народ поставит Нафлеймил
Подробней на этом моменте, как "сразу сформируем основу"? Возьми страницу yandex.ru к примеру, убедись что там масса мелких картинок, баннерами не являющиеся. Можно посмотреть исходники adblock под лису, они открыты, алгоритм бывает лажает но не часто. Но! из общего абстрактного анализатора контента предложенного 12345c ты сейчас предлагаешь делать банерорезалку |
| Автор: JSman 25.8.2006, 02:10 | ||
| итак, я предлагаю сделать на первом этапе "банерорезалку" и то, что разграничит контент в страниц е на JSCRIPT, CSS, HTML. а потом будем бороться с "неправильной" версткой. Добавлено @ 02:14 1й этап - разграничение на 3 логических части. 2й этап - нахождение одинаковых стилей для разных тэгов (например отступы параграфа) 3й этап - поиск альтернативы последовательности тэгов. Добавлено @ 02:24 дополнения между 1м и 2м этапом: "банерорезалка". по 2му этапу: будем создавать классы и вписывать общие inline-стили. а location.href включает .yandex - это этап №1
на TABLE как я понял, чтобы не спутал с CSS |
| Автор: JSman 25.8.2006, 02:26 |
| тэгов Добавлено @ 02:28 блин, ну если реально сделать эту штуку, то ващще будет Добавлено @ 02:32 ребят, я советую сделать на HTML, а не PDF и тд - помучаемся, зато итог классный: мало весит, код красивый - ай, сказка и JSCRIPT впихнем в реализацию кодирования |
| Автор: Sardar 25.8.2006, 11:59 | ||||
Сейчас придёт 12345c и будет нас матом крыть за испохабленную идею Во вторых, форум != чат, пиши в одном посте
Вижу ты мало верстал. Можно написать рендер страницы, не графический естественно, мне на первый взгляд на Java уйдёт от силы 2 месяца (для JS можно Rhino прикрутить + стандартные браузерные обьекты). Рендер будет "рисовать" вёрстку в нечто промежуточное со стилями, как это делает браузер. Фактически <p>, <i> и прочие элементы это всё один элемент с разными стилями "по умолчанию". НО! возникнут проблемы:
В PDF хорошо тем, что рендерит с well-defined XSL-FO, всегда можно тыкнуть пальцем и сказать "ламо написали глюкавый рендер", в отличии от браузеров, которые рождены много раньше чем стандарты которые они должны поддерживать. Конечно результаты представляют чисто научный интерес, ибо в жизни ты с этими PDF'ками... хотя из XSL-FO легко HTML+CSS генерить. Долго думал... собери мысль по новой |
| Автор: JSman 25.8.2006, 19:39 | ||||
кстати, он кажется забил уже на нее ))))) не видно его! нечаянно! просто ночью мысль в голове била!
согласен, но она прикрепляется через атрибуты-события ( ONCLICK="...") - можно присоединить ID и сделать по загрузке attachEvent/addListener либо просто присвоить событию функцию напрямую. проблем нет! дизайн дизайном, верстка - нечто отдельное. ну не скажи.. вот недавно я пришел на фирму, меня попросили переверстать страницы сделанные на frontpage (сколько мусора было! ужас!)! вот эта программа бы понадобилась. а так вручную минут 5 потратил! 12345c тоже хочет. . ну шо вы такое говорите. понятное дело, что будем учитывать поддержку различных браузеров. 1й этап предлагаю сделать на JSCRIPT ради приличия хоть... товарищи, форум-то джаваскриптовый! анализаторы, анализаторы... графический не нужен. забадаемся, и вообще гибельное дело. разборы на прямоугольники, смотреть что куда сместить.. не стОит. лучше думать над удалением ненужных стилей, изменении существующих, объединении. моя точка зрения состоит в том, что анализатор кода совершенней анализатора графики. |
| Автор: Sardar 25.8.2006, 21:15 | ||||||||
Я не про привязку по ID. Например сейчас нет в JS нормального XPath (пинать ленивых разработчиков браузера, и совсем презирать ламов из ECMA, не шевеляться), следовательно приходиться перебирать ноды в ручную. Следовательно ожидаешь что какие то ноды существуют и где они находяться. А тут раз разметка поменялась, скрипты слетели. Зри глубже Я бы сказал "обьясни это 80% всех верстальщиков", но не смогу, т.к. сам верстаю с извратами. Почему? Потому что сначала верстаешь хорошо по стандартам, а потом подгоняешь напильником под все браузеры, вот тогда она самая серемяжная правда наружу и вылезает
Тут сложней анализ будет, front page отстойно вещи на абсолютную позицию ставить любит, следовательно нужно как то проецировать на документ и вгонять в поток документа с нормальными стилями. А это очень даже не простая задача...
А иначе как вынести стили? Выкладывай свою идею
JSman, давай поменьше бравады и больше здравых мыслей, взрослые же люди всё таки |
| Автор: JSman 26.8.2006, 00:09 |
| давай определяться. накидаем общий план. будем конкретней. этапы чуть изменил. я ПРЕДЛАГАЮ: 1 этап: разделение на логические части. полностью убираем из страницы банеры и комментарии (по желанию пользователя). затем убираем inline-стили, inline-script. в случае стилей - создаем классы, в случае скриптов - привязка по ID. после разделения проверяем страницу на выполнение скриптов. если без ошибок, то все ok. если все-таки скрипт привязали к иерархии, то чуть-чуть сложнее. тогда иерархию не будем трогать. итак, первый этап как реализуется. с помощью JSCRIPT проходим по нодам. 1) убираем атрибуты, имеющие аналогичное значение на CSS, типа как CELLPADDING, CELLSPACING тэга TABLE. 2) создаем классы из инлайн-стилей 3) убираем инлайн-скрипты 4) закрываем незакрытые тэги. 5) приводим тэги согласно XML ( <br /> <img />), разбираемся с перекрываемостью. тем самым, избавляем страницу от ошибок. 6) убираем лишний контент: комментарии, в CSS свойства, начинающиеся на mso-... ( - от MsWord) что имеем после 1го этапа? 3 строго отдельных части: STYLE, SCRIPT, BODY иерархия пока не изменена. 2 этап - думаю, что лучше будет, разбирать последовательности тэгов и стилей. это и есть анализатор. сложно, очень сложно.. тут в первую очередь надо определиться с самой версткой. подумаем над каждым элементом. тело документа будет состоять из 1) блоков (DIV) роль блоков - позиционирование (мне кажется только это, если нет поправь меня, + AJAX?) 2) таблицы 3) текстовые элементы: заголовки 6 уровней, параграфы в параграфы входят а) списки б) strong, i (хотя от него отказались W3C) и span (для особых стилей) в) анкоры и ссылки 4) инлайн-фреймы. каждый элемент должен выполнять строго отведенную ему роль. сначала меняем лишние тэги (например, u на span с классом), неудовлетворяющие нас. это была подготовка. тут нужно понять, что нужно пользователю. варианты: 1. упростить структуру тэгов, не изменив отображение (вид) (или в допустимых рамках). 2. сделать текст читабельным, а сам дизайн - приятным на глаз 3. выделить полезное содержание в случае 2го варианта, нужны заранее созданные стили + избавиться от горизонтальной прокрутки полностью (или учитывать исключения) 1й вариант сложноватый. что мы имеем.. до фига тэгов с классами. цель - возможное их сокращение и приведение по правилам нашей верстки. 1) надо рассмотреть общее содержимое классов дочерних тэгов одного уровня в иерархии и объединить их. 2) очень часто при создании в редакторах разработчики по нелепости могут выделить часть текста другим похожим шрифтом на должный. надо убирать лишние шрифты. 3) тоже самое относится к выбору цвета. пока все было по исправлению верстки.. теперь по теме 3й вариант. добывание полезной информации.. - полезность - понятие относительное! я думаю , что лучший подход будет таков: пользователь выделяет мышкой тот контент, который ему нужен. те, прямоугольники, которые не попали, обрабатывать/вносить в заключительную верстку не будем. если несколько страниц с одного сайта и изначальная верстка хоть как-то соответствует шаблону, то программа может "учиться". по примеру 1-2х страниц, работать над остальной частью. мой вывод: без воли пользователя не обойтись. пользователь должен делать ставку на полезность. нужны ли ему картинки с логотипом сайта вверху страницы или основное содержание, банеры и ActiveX и прочее |
| Автор: 12345c 26.8.2006, 12:04 | ||||
Понадобилось выполнять цикл, включающий фрагмент кода, размещённый в шаблоне. Поэтому вызываю функцию с текстом-кодом. Теперь осталось выявить закономерности в используемых шаблонах, чтобы выработать компактную функцию. Цель в том, чтобы шаблон смотрелся наглядно и естественно, примерно как математический знак суммы. Конечно, я ориентируюсь на реальные задачи. Сначала задаю структуру, потом запускаю распознаватель. По результатам джб видно, удачна структура или нет. Но в распознаватель надо включить постоянные процедуры типа игнорирования пробелов, чтобы не прописывать каждый раз их явно. Тогда распознавателем будет удобно пользоваться, и, кроме того, он будет показывать ошибки и отклонения от структуры. Результаты первого действия выложу в другую тему после того как напишу. Добавлено @ 12:07
|
| Автор: 12345c 26.8.2006, 12:55 | ||
| Идея баннерорезки, которую вы тут развили - она тоже парсер с правилами, алгоритм может использоваться, но это обычно делают в прокси, не на JS. Хотя, есть идея работать по DOM внутри сгенерированной страницы (процедура внедряется через прокси, если это в онлайне вырезают баннеры "на лету" или включается вручную строкой вызова скрипта, если идёт анализ страниц для извлекания информации по шаблону. JSman, люди уже писали программы выбразывания мусора, сделанного в Frontpage. Если поискать по ресурсам программ, найдётся. Аналогичное должно существовать и для Word. Но переверстать произвольный текст в правильный - сильно неопределённая задача. Нужно сначала проработат всю технику перевода (что невозможно по объёму исследования поддержки глюков разных версий бр-ров), потом расписывать строение анализатора. Упрощённая версия - ограничиваемся "каноническими" методами, которые тоже надо выделить из опыта правильной вёрстки, которые будут одинаково показываться в бр-рах. Но не исключено, что придёт новая версия и всё испортит. Тут надо придерживаться работы по доктайпам, и, чтобы действие было признано сообществом, работа должна постоянно ссылаться на стандарты и понимать дух их развития. Если это будет, она может повлиять на выработку правильной вёрстки вообще, а так - одна из версий. Из режимов я бы добавил к приятному на глаз ещё суперприятный на глаз Приятность надо сначала вычислить формулой, потом написать операторы итераций, чтобы потом применить метод Рунге-Кутта Но мне пока от анализатора нужно выделение информации из достаточно правильной и описанной вручную шаблонами структуры. Надобность анализатора пока только предполагается, а сейчас конкретные усилия идут на синтез кода из вручную выделенной информации. В этом деле появилось ещё 1 направление (тоже опишу в отдельной теме) - вытащить часть вёрстки в JavaScript, чтобы брать её из кешированного скриптового файла. А то, что останется на HTML, должночитаться поисковиками и браузерами с отключённым JS.
|
| Автор: Sardar 26.8.2006, 20:06 | ||||||||||||||||
Как? Нука обрисуй алгоритм, по которому можно с большой долей вероятности сказать баннер перед нами или нет. Конечно большинство баннеров имеют фиксированный размер, если работать с DOM деревом, но тогда не известно как он был туда вставлен (какой скрупт). Если парсим текст сами, то как узнать что есть баннер, ведь это почти всегда замороченный JS.
В DOM дереве не существует не закрытых тегов и т.п. дерево уже разобрано, а вот при записи можно конечно привести всё к XHTML. ИМХО задача левая для JS, это не язык, на котором удобно писать анализаторы.
Тебя дизайнеры расстреляют
Нет, фактически весь документ может быть отображён узлами единого типа, но с разными стилями. div это блочный элемент, т.е. имеет контейнер. Прочти CSS2 спецификацию, многое узнаешь о строении и отрисовке документов.
Как? Эвристика? А может нейронную сеть лет так сотню обучать, тогда может процент ошибок будеть меньше...
Горизонтальная прокрутка - есть результат фиксированных размеров, не влезающих в экран. "Убрать" так просто нельзя, не изменив внешнего вида (буквально страница развалиться). Добавлено @ 20:15
Вот это хорошее уточнение, значит ищем по шаблону. Наиболее просто для XML документов, это через XSLT выбрать инфу в точно известных узлах (копировать можно целые поддеревья) в новый документ. Баннеры и прочий меяющийся шум в документе не будет мешать до тех пор, пока XPath выборки указывают на требуемые ноды, т.е. структура документа в целом не меняеться. Такой шаблон придёться делать для каждой группы документов со своей уникальной структурой. Для юзера удобной шкуркой будет выделение мышью необходимого контента, как уже говорил JSman. |
| Автор: 12345c 26.8.2006, 22:11 |
| Sardar, документы, из которых придётся что-то извлекать, обычно далеко не xml - справочники, книги, образы сайтов. С дизайном, свёрстанным вручную. полностью убираем из страницы баннеры [/quote](Если пытаться через JS парсить реальные страницы, прежде прокси-сервером надо удалять содержимое фреймов чужих доменов, иначе не будет работать.) [quote=Sardar, 26.8.2006, 20:06, post834438] |
| Автор: JSman 26.8.2006, 23:16 | ||||||||||
есть банеры 3х видов: IMG, IFRAME, ActiveXObject (Flash) IMG делают ссылку на другой хост. IFRAME - полностью состоит из ссылок и картинок на другой хост (Google) Flash - вся канва перекрыта объектом button, при клике ведущий, опять же, на другой хост. доступ к объектам через свойства и тд можно также учитывать их расположение на странице: до/после основного содержимого, отдельно сбоку странички. это вообще отдельная тема.
ну ты меня не понял. на этом этапе основной целью является переделка верстки. анализатор по этой части написать можно. даже на регЭксп c js ты сам знаешь, что красивые и удобные страницы пользователь не захочет править. это лишь дополнительная опция по анализу шрифта и цвета. с mso разговор КААРОТКИЙ. тут понятно.
я замечательно знаю CSS, но, опять же, я же не просто так написал типа по-незнанию. есть тэги, играющие по нашим правилам. вот, что я писал
мы весь обрабатываемый контент подводим по нашим правилам. типа текст - это совокупность заголовков и параграфов. а не дивов со спанами. надо его, текст, стандартизовать, то есть вставить тэги, которые бы следовало написать.
по 3му ясно - это выделение мышкой. 2е! если пользователь не доволен полностью отображение текста на странице, ее цветовой гамме и тд и тп, то решение сходится к созданию страницы по шаблону, с заранее подготовленными стилями. на пример текст с комиком заменить на ариал, увеличить размер шрифта, абзацы сделать, серый ткст на сером фоне сделать черным, к черту убрать этот серый фон и тд и банер этот тоже бесит ))) это уже по приколу 1е - последовательность тэгов! нужно сводить до минимума положение "контейнер в контейнере" (для див актуально). сложно,конечно, но интересно. и есть другие ситуации.
да. но для боди в некоторых случаях подойдет. 12345c, я прошу тебя четко объяснить, что ты хочешь. я пока не особо дорубаюсь, чем твоя точка зрения принципиально отличается от изложенного выше. ну торможу я! зачем эта работа с шаблоном, выявление несоответствия со структурой.. ну не знаю, я так понимаю: у разработчика есть странички, он захотел поменять верстку. полезным остался только текст. у него есть шаблон для создания новых. он берет текст из старых и вставляет в шаблон. можно написать прогу, которая автоматизирует процесс. зачем анализатор тогда? |
| Автор: JSman 26.8.2006, 23:37 |
| пора определять этапы, товарищи! |
| Автор: Sardar 27.8.2006, 01:08 |
ОК, ладно, чисто ради прикола в свободное время:
На досуге покопаюсь в кобре. |
| Автор: 12345c 27.8.2006, 01:22 |
| для анализа чужих кодов, я же раза 2 об этом написал. |
| Автор: JSman 27.8.2006, 20:07 |
или возможен ))) давайте так (Sardar, 12345c) , пока начнем что-нибудь, потом покажем, совместим, что возможно, подумаем. мне надо хоть в Москву приехать, а то Сочи, море, пляж, отдых в общем. с 5го числа серьезно займусь. для меня тут и перлом пахнет, дельфи, жс. посмотрим. |
| Автор: Sardar 27.8.2006, 21:21 |
JSman, открывай новую тему, выкладывай конкретные маленькие задачи (например парсер CSS в дерево аттрибутов). Дизайн всей этой софтины сам придумай, я лишь с кодом на конкретные задачи в свободное время помогу. |