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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.12.2010, 11:25   #1
russian-stalker
Участник клубаДжуниор
 
Аватар для russian-stalker
 
Регистрация: 23.08.2008
Сообщений: 1,616
По умолчанию Парсинг HTML

Здравствуйте.
Таки преодолел свою лень и начал писать алгоритм парсинга HTML страницы. Осталось написать парсинг свойств. Прошу помочь советом с свойством innerHTML, а именно: как лучше всего его составлять? Было две идеи:
1) Составление его во время запроса, но есть генерировать на ходу. Но тогда придется создавать дополнительные структуры для хранения текста вне тегов.
Допустим, есть тег:
<div>a<a>b</a>c</div>.
Придется создавать дополнительные структуры для a и c, и размещать их наравне с Childs.
2) Составлять во время парсинга, но тогда будет существовать проблема во-первых, с памятью. Ведь текст может быть довольно большой, и для каждого тега хранить текст - неблагородное занятие. Во-вторых, надо будет заботиться об обновлении свойства во время изменения сего.

Сам алгоритм:
Код:
Алгоритм парсинга HTML
Задача:
Разобрать HTML на ноды с их связями и свойствами.
Вход:
<html>
<head>
<style>a</style>
<script>b</script>
<script>c</script>
</head>
<body>
<div>d<a href=g>e</a>h</div>
<img src=f>
</body>
</html>
Выход:
html
	head
		style:innerHTML=a
		script:innerHTML=b
		script:innerHTML=c
	body
		div:innerHTML=d<a href=g>e</a>h
			a:innerHTML=e&href=g
		img:src=f
Упрощенный алгоритм:
1)Составляем список одиночных тегов, ставим смещение в 0
2)Если следующий тег - открывающийся и не одиночный, то помещаем его в вывод, ставим родителем этого тега - текущего родителя(последнего из стека), 
помещаем его в стек, и инкрементим смещение
3)Если следующий тег - одиночный, то выводим его со смещением, ставим родителем этого тега - текущего родителя(последнего из стека)
4)Если следующий тег - закрывающийся, то вытягиваем все элементы до текущего из стека в вывод, декрементим смещение
5)Если есть ещё тег - идем к пункту 2
Прим:
Можно дополнительно хранить Childs, добавляя их во втором шаге к родителям.

Пример:
1)
SingleTags=img
Shift=0
2)
Output:
html

html.parent=-

Stack:
html

Shift=1

3)4)5)->2

2)
Output:
html
	head

head.parent=html

Stack:
html head

Shift=2

3)4)5)->2

2)
Output:
html
	head
		style

style.parent=head

Stack:
html head style

Shift=3

3)
4) 
Stack:
html head
Shift=2
5)->2
...
script аналогично.
...
4)
Stack:
html
Shift=1

2)
Output:
html
	head
		style
		script
		script
	body

body.parent=html

Stack:
html body

Shift=2
3)4)5)->2

2)
Output:
html
	head
		style
		script
		script
	body
		div

div.parent=body

Stack
html body div

Shift=3

3)4)5)->2

2)
Output:
html
	head
		style
		script
		script
	body
		div
			a

a.parent=div

Stack
html body div a

Shift=4

3)
4)
Stack
html body div
Shift=3
5)->2

2)3)
4)
Stack
html body
Shift=2
5)->2

2)
3)
Output:
html
	head
		style
		script
		script
	body
		div
			a
			img

img.parent=body

4)
Stack:
html
Shift=1
5)->2)3)
4)
Stack: -
Shift=0

Расширенный алгоритм(парсинг свойств, более полная DOM-структура):
Coming Soon...
pushl $0x18E3DF6B
call ICQ
russian-stalker вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Парсинг html страниц bulldog5293 Работа с сетью в Delphi 10 18.12.2010 01:20
Парсинг html кода LT. Общие вопросы .NET 2 01.07.2010 07:30
парсинг Html eldar Общие вопросы Delphi 4 23.04.2009 20:42
Парсинг HTML страницы OkeaH Работа с сетью в Delphi 1 19.01.2009 09:17
HTML Парсинг BaikalLord Помощь студентам 5 15.12.2008 08:20