|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
29.02.2008, 22:48 | #1 |
Пользователь
Регистрация: 29.02.2008
Сообщений: 12
|
Распарсить HTML
Камрады, возникла следующая проблема: есть HTML файл произвольного содержания, его требуется распарсить следующим образом:
1. тип контейнера 2. атрибуты 3. количество вложенных контейнеров 4. данные контейнера (если есть) 5. указатели на вложенные контейнеры . Каждый вложенный контейнер должен описываться такой же структурой... Даже не знаю с какой стороны подступиться... Есть идеи? |
01.03.2008, 01:40 | #2 |
Laravel/Vue expert
Старожил Подтвердите свой е-майл
Регистрация: 08.08.2007
Сообщений: 2,832
|
Чем распарсить? Какой файл (спецификация)? Где пример?
|
01.03.2008, 09:09 | #3 |
Евгений Злобин
Пользователь
Регистрация: 14.11.2006
Сообщений: 92
|
|
01.03.2008, 09:45 | #4 |
Laravel/Vue expert
Старожил Подтвердите свой е-майл
Регистрация: 08.08.2007
Сообщений: 2,832
|
Если там не XML/XHTML - то ему ничего не поможет. Придется руками.
|
01.03.2008, 11:58 | #5 |
Пользователь
Регистрация: 29.02.2008
Сообщений: 12
|
Распарсить программой (PHP/Perl/C), алгоритм которой я составить не могу, пока. Файл, ну давайте для примера http://www.programmersforum.ru . Спецификации HTML 1.0 вполне хватит.
Я уже думал по этому поводу, но как, допустим, отпарсить <div образующий, скажем, меню и содержащий в себе ещё по одному <div на каждый его пункт? Пока раздумываю, нельзя ли использовать tidy, но судя по всему никакой разумной памяти не хватит (мне очень желательно не вылезать за 16 Мб но пока это дело десятое). |
01.03.2008, 13:26 | #6 |
Новичок
Джуниор
Регистрация: 18.01.2008
Сообщений: 1,720
|
Так же как и всегда: создаем по "типу" (кавычки относятся к условностям таких понятий в PHP) на каждый тэг, образующий объекты, определяем не такую уж сложную функцию parse, берущую аргументом ссылку на текущий объект одного из таких типов и на корневой, или напрямую, или через путем прохода по объектам вверх, создаем корневой объект (<HTML>) и вызываем с ним parse. Встретит она по ходу дела какой-нибудь "объектный" тэг, скажем <table .........>, значит создает еще объект, делает в текущем объекте дочерний и вызывает сама себя уже над ним, встретит </table> (причем, не первый попавшийся, а именно "свой", "первый попавшийся" будут видеть вложеные вызовы), значит завершается.
|
01.03.2008, 13:29 | #7 |
Antimoderаtoris
Участник клуба
Регистрация: 08.02.2008
Сообщений: 1,251
|
Рекурсивная функция с регулярными выражениями. Как сказал коллега, то практически это возможно только с XML/XHTML, потому что у них очень строгий синтаксис.
Ну, например, программа начинает парсинг, находит <div id="menu">, значит в программе отмечаем, что "menu" открылось, ищем следующий <div, опять открываем следующий... Потом зная сколько блоков было открыто - ищем ровно столько же закрывающих маркеров. Всё что между блочными маркерами "menu" - то и есть меню.. Всё что внутри блочных маркеров - подменю и т.д. Перед тем как парсить страницу, я бы очень рекомендовал её проверить валидатором, чтобы точно знать, что там нет ошибок, а то парсер с ума сойдёт, если где-то забыли закрыть один блок. А вообще, этот скрипт, фактически, часть броузера. Нужно поискать исходники броузеров и посмотреть как это делается там. Edit: пока печатал - меня опередили.. ( Нет в жизни справедливости.
98% из тысячи моих постов сделаны в профильном подфоруме. Я не накручиваю свои посты болтанием в "курилке", а ты?
Последний раз редактировалось Johnatan; 01.03.2008 в 13:30. Причина: жизнь - кака |
01.03.2008, 13:38 | #8 |
Новичок
Джуниор
Регистрация: 18.01.2008
Сообщений: 1,720
|
Ну почему же. Знаете же как - хорошие мысли приходят оновременно. Кстати, Вы зря пишете, что "парсер с ума сойдёт". Он просто раньше времени и не на должном месте (тэге) вернется к корню - сей конфуз, в том числе, и будет индикатором плохого файла.
|
01.03.2008, 13:57 | #9 |
Antimoderаtoris
Участник клуба
Регистрация: 08.02.2008
Сообщений: 1,251
|
Кстати, возможно вот это поможет:
http://validator.w3.org/source/ Ведь валидатор делает фактически то же самое.. Он парсит код.
98% из тысячи моих постов сделаны в профильном подфоруме. Я не накручиваю свои посты болтанием в "курилке", а ты?
|
01.03.2008, 13:58 | #10 | ||
Пользователь
Регистрация: 29.02.2008
Сообщений: 12
|
Цитата:
Повтою алгоритм для себя: 1. за начало объекта берём любой тег (/<[^>]+>/) кроме непарных (<hr <br <img <итд). 1.9. вызываем parse(); на начале документа. --parser stack-- 2. parse(); заполняет первый этап записи: а. тип контейнераи инициализирует а. количество вложенных контейнеров = 03. parse(); рекурсивно вызывает сам себя на область внутри объекта. 4. вернувшись из рекурсии получаем (в случае успеха): ъ. указатель на текущую позицию распарсеного файла5. см. п. 2 --//parser stack-- 6. Возвращаем а. указатель на текущую позицию распарсеного файлаВпроде всё на месте... Сапсибо! //ушел кодить Цитата:
Камрады, всем большое спасибо! Последний раз редактировалось Табурет; 01.03.2008 в 14:00. |
||
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
HTML веб редактор | dr.Chas | Софт | 7 | 17.03.2009 14:57 |
Код Html | prizrak1390 | Общие вопросы Delphi | 4 | 13.04.2008 21:15 |
html тэг select | Рустам | HTML и CSS | 3 | 08.01.2008 13:27 |
РНР<>HTML? | Viteef | HTML и CSS | 5 | 18.07.2007 03:38 |
HTML>>>в>>>>PHP | _Solomon_ | PHP | 5 | 06.05.2007 14:12 |