Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.02.2008, 22:48   #1
Табурет
Пользователь
 
Аватар для Табурет
 
Регистрация: 29.02.2008
Сообщений: 12
По умолчанию Распарсить HTML

Камрады, возникла следующая проблема: есть HTML файл произвольного содержания, его требуется распарсить следующим образом:
1. тип контейнера
2. атрибуты
3. количество вложенных контейнеров
4. данные контейнера (если есть)
5. указатели на вложенные контейнеры
.
Каждый вложенный контейнер должен описываться такой же структурой...
Даже не знаю с какой стороны подступиться... Есть идеи?
Табурет вне форума Ответить с цитированием
Старый 01.03.2008, 01:40   #2
SkyM@n
Laravel/Vue expert
Старожил Подтвердите свой е-майл
 
Аватар для SkyM@n
 
Регистрация: 08.08.2007
Сообщений: 2,832
По умолчанию

Чем распарсить? Какой файл (спецификация)? Где пример?
SkyM@n вне форума Ответить с цитированием
Старый 01.03.2008, 09:09   #3
ZEVS
Евгений Злобин
Пользователь
 
Аватар для ZEVS
 
Регистрация: 14.11.2006
Сообщений: 92
По умолчанию

Цитата:
Сообщение от Табурет Посмотреть сообщение
Есть идеи?
регулярные выражения
ZEVS вне форума Ответить с цитированием
Старый 01.03.2008, 09:45   #4
SkyM@n
Laravel/Vue expert
Старожил Подтвердите свой е-майл
 
Аватар для SkyM@n
 
Регистрация: 08.08.2007
Сообщений: 2,832
По умолчанию

Если там не XML/XHTML - то ему ничего не поможет. Придется руками.
SkyM@n вне форума Ответить с цитированием
Старый 01.03.2008, 11:58   #5
Табурет
Пользователь
 
Аватар для Табурет
 
Регистрация: 29.02.2008
Сообщений: 12
По умолчанию

Цитата:
Сообщение от SkyM@n Посмотреть сообщение
Чем распарсить? Какой файл (спецификация)? Где пример?
Распарсить программой (PHP/Perl/C), алгоритм которой я составить не могу, пока. Файл, ну давайте для примера http://www.programmersforum.ru . Спецификации HTML 1.0 вполне хватит.

Цитата:
Сообщение от ZEVS Посмотреть сообщение
регулярные выражения
Я уже думал по этому поводу, но как, допустим, отпарсить <div образующий, скажем, меню и содержащий в себе ещё по одному <div на каждый его пункт?

Пока раздумываю, нельзя ли использовать tidy, но судя по всему никакой разумной памяти не хватит (мне очень желательно не вылезать за 16 Мб но пока это дело десятое).
Табурет вне форума Ответить с цитированием
Старый 01.03.2008, 13:26   #6
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Так же как и всегда: создаем по "типу" (кавычки относятся к условностям таких понятий в PHP) на каждый тэг, образующий объекты, определяем не такую уж сложную функцию parse, берущую аргументом ссылку на текущий объект одного из таких типов и на корневой, или напрямую, или через путем прохода по объектам вверх, создаем корневой объект (<HTML>) и вызываем с ним parse. Встретит она по ходу дела какой-нибудь "объектный" тэг, скажем <table .........>, значит создает еще объект, делает в текущем объекте дочерний и вызывает сама себя уже над ним, встретит </table> (причем, не первый попавшийся, а именно "свой", "первый попавшийся" будут видеть вложеные вызовы), значит завершается.
B_N вне форума Ответить с цитированием
Старый 01.03.2008, 13:29   #7
Johnatan
Antimoderаtoris
Участник клуба
 
Регистрация: 08.02.2008
Сообщений: 1,251
По умолчанию

Рекурсивная функция с регулярными выражениями. Как сказал коллега, то практически это возможно только с XML/XHTML, потому что у них очень строгий синтаксис.

Ну, например, программа начинает парсинг, находит <div id="menu">, значит в программе отмечаем, что "menu" открылось, ищем следующий <div, опять открываем следующий... Потом зная сколько блоков было открыто - ищем ровно столько же закрывающих маркеров. Всё что между блочными маркерами "menu" - то и есть меню.. Всё что внутри блочных маркеров - подменю и т.д.

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

А вообще, этот скрипт, фактически, часть броузера. Нужно поискать исходники броузеров и посмотреть как это делается там.

Edit: пока печатал - меня опередили.. ( Нет в жизни справедливости.
98% из тысячи моих постов сделаны в профильном подфоруме. Я не накручиваю свои посты болтанием в "курилке", а ты?

Последний раз редактировалось Johnatan; 01.03.2008 в 13:30. Причина: жизнь - кака
Johnatan вне форума Ответить с цитированием
Старый 01.03.2008, 13:38   #8
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Johnatan Посмотреть сообщение
Edit: пока печатал - меня опередили.. ( Нет в жизни справедливости.
Ну почему же. Знаете же как - хорошие мысли приходят оновременно. Кстати, Вы зря пишете, что "парсер с ума сойдёт". Он просто раньше времени и не на должном месте (тэге) вернется к корню - сей конфуз, в том числе, и будет индикатором плохого файла.
B_N вне форума Ответить с цитированием
Старый 01.03.2008, 13:57   #9
Johnatan
Antimoderаtoris
Участник клуба
 
Регистрация: 08.02.2008
Сообщений: 1,251
По умолчанию

Кстати, возможно вот это поможет:
http://validator.w3.org/source/
Ведь валидатор делает фактически то же самое.. Он парсит код.
98% из тысячи моих постов сделаны в профильном подфоруме. Я не накручиваю свои посты болтанием в "курилке", а ты?
Johnatan вне форума Ответить с цитированием
Старый 01.03.2008, 13:58   #10
Табурет
Пользователь
 
Аватар для Табурет
 
Регистрация: 29.02.2008
Сообщений: 12
По умолчанию

Цитата:
Сообщение от B_N Посмотреть сообщение
Так же как и всегда: создаем по "типу" (кавычки относятся к условностям таких понятий в PHP) на каждый тэг, образующий объекты, определяем не такую уж сложную функцию parse, берущую аргументом ссылку на текущий объект одного из таких типов и на корневой, или напрямую, или через путем прохода по объектам вверх, создаем корневой объект (<HTML>) и вызываем с ним parse. Встретит она по ходу дела какой-нибудь "объектный" тэг, скажем <table .........>, значит создает еще объект, делает в текущем объекте дочерний и вызывает сама себя уже над ним, встретит </table> (причем, не первый попавшийся, а именно "свой", "первый попавшийся" будут видеть вложеные вызовы), значит завершается.
Туплю.
Повтою алгоритм для себя:
1. за начало объекта берём любой тег (/<[^>]+>/) кроме непарных (<hr <br <img <итд).
1.9. вызываем parse(); на начале документа.
--parser stack--
2. parse(); заполняет первый этап записи:
а. тип контейнера
б. атрибуты
и инициализирует
а. количество вложенных контейнеров = 0
б. данные контейнера = ""
в. указатели на вложенные контейнеры = void
3. parse(); рекурсивно вызывает сам себя на область внутри объекта.
4. вернувшись из рекурсии получаем (в случае успеха):
ъ. указатель на текущую позицию распарсеного файла
а. количество вложенных контейнеров ++
б. if(is_array(данные контейнера)) array_push(данные контейнера,...); данные контейнера=array(...);
в. if(is_array(указатели на вложенные контейнеры)) array_push(указатели на вложенные контейнеры,...); указатели на вложенные контейнеры=array(...);
5. см. п. 2
--//parser stack--
6. Возвращаем
а. указатель на текущую позицию распарсеного файла
б. данные контейнера(если есть)
Впроде всё на месте...
Сапсибо!
//ушел кодить

Цитата:
Сообщение от Johnatan Посмотреть сообщение
Кстати, возможно вот это поможет:
http://validator.w3.org/source/
Ведь валидатор делает фактически то же самое.. Он парсит код.
Есть другая хорошая штука - tidy - он и валидатор и исправлять корявки умеет.

Камрады, всем большое спасибо!

Последний раз редактировалось Табурет; 01.03.2008 в 14:00.
Табурет вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
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