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

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

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.08.2011, 19:05   #1
Лубышев
Участник клуба
 
Аватар для Лубышев
 
Регистрация: 23.07.2007
Сообщений: 1,054
Вопрос HTML DOM

возникла проблема:
я анализирую html документ
сначала писал свой парсер, потом пробовал регулярки а потом когда познакомился поближе с PHP увидел как круто юзать DOM модель документа.
На Delphi есть библиотека Инди которая вроде бы как позваляет юзать дом-модельку.
Код:
Doc := coHTMLDocument.Create as IHTMLDocument2;
что то вроде такого вызова.

не где толком не нашел литературы обьясняющей на понятном языке как работать с этим.
простую задачку где просто выдергивается содиржимое всех тегов например ('td') видел (привожу не весь код а смысл только)
Код:
  DocA:=Doc.all.tags('td') as IHTMLElementCollection;
  for i:=0 to DocA.length-1 do
    begin
      DocElement:=DocA.item(i,0)as IHTMLElement;
      memo1.lines.Add(DocElement.innerText) //читаем текст внутри тега
    end;
Но передо мной стоит следующая задача:
Считать все содержимое тегов(обьектов)-например таблиц, построив списочек всех таблиц, прочитать интересующие меня атрибуты, открыть таблицу, прочитать список (tr) так же посмотреть какие там атрибуты
из списка (tr) прочитать список (td) посмотреть значения, атрибуты и далее возможно там еще какие то вложенные элементы есть. прочитать их и т.п.
то есть я хочу бродить по всей этой древовидной иерархии, читать значения, атрибуты и т.п.
помогите плиз, хотяб ссылочкой, книжечкой(на русском), компонентиком (если есть аналоги круче индейки) иль примерчиком. буду весьма благодарен.
Писано по д'Эльфийски
Лубышев вне форума Ответить с цитированием
Старый 22.08.2011, 19:36   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

начнем с того что насколько я знаю это mshtml, но уж точно не инди.

а инфа есть в гугле:
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.08.2011, 20:43   #3
Лубышев
Участник клуба
 
Аватар для Лубышев
 
Регистрация: 23.07.2007
Сообщений: 1,054
По умолчанию

да ты прав, просто давно не садился за эту задачу и перепутал просто у меня инди в этом проекте тоже юзается и написание idКомпонент и IHTMLElementCollection легко можно стутать при беглом взгляде.
что то если честно я мне этот компонент не нравится (IHTMLElementCollection). как мне лучше всего работать с DOMом?
Писано по д'Эльфийски
Лубышев вне форума Ответить с цитированием
Старый 22.08.2011, 22:07   #4
Lesha
Форумчанин
 
Аватар для Lesha
 
Регистрация: 30.01.2009
Сообщений: 418
По умолчанию

можно через Webrowser

береш отсюда модуль
http://forums.avtograd.ru/index.php?...post&p=1672104

jsWebBrowser

подключаеш его в проекте в самом верхнем USES после все остального.

после этого стандартный компонент TWebbrowser получит дополнительные методы для работы с JavaScript на странице

краткая документация

http://jqbook.narod.ru/works/jsWebBrowser.htm

Последний раз редактировалось Lesha; 22.08.2011 в 22:16.
Lesha вне форума Ответить с цитированием
Старый 23.08.2011, 01:24   #5
Лубышев
Участник клуба
 
Аватар для Лубышев
 
Регистрация: 23.07.2007
Сообщений: 1,054
По умолчанию

вы наверное меня не правильно поняли мне надо читать DOM модель документа будь это HTML или XML прочитать допустим все обьекты и их атрибуты, потом двинутся внутрь и внутри тега прочитать тоже все а потом еще внутрь и так далее
Писано по д'Эльфийски
Лубышев вне форума Ответить с цитированием
Старый 23.08.2011, 12:44   #6
Лубышев
Участник клуба
 
Аватар для Лубышев
 
Регистрация: 23.07.2007
Сообщений: 1,054
По умолчанию

попробовал XMLDocument
но что то не айс а так то было круто если бы было что то подобное но заточенное под html.
постоянно выводятся ошибки. видимо из за не валидности документов. даже на страницу гугла ругается. надо что то по-гибше.
Писано по д'Эльфийски

Последний раз редактировалось Лубышев; 23.08.2011 в 12:51.
Лубышев вне форума Ответить с цитированием
Старый 24.08.2011, 00:42   #7
Лубышев
Участник клуба
 
Аватар для Лубышев
 
Регистрация: 23.07.2007
Сообщений: 1,054
По умолчанию

ответов все еще нет а я уже начинаю кое что тута понимать:
допустим считали все tr
Код:
 DocA:=Doc.all.tags('tr') as IHTMLElementCollection;
схватили первый tr
Код:
DocElement:=DocA.item(i,0)as IHTMLElement;
теперь надо было посмотреть что внутри него...
оказывается он тоже может возвращать коллекцию дочерних элементов
Код:
DocB:=DocElement.all  as IHTMLElementCollection;
теперь так же можно схватить любой вложенный элемент
цепляем допустим первый
Код:
DocElement2:=Docb.item(i,0)as IHTMLElement;
а чтоб вывести это дело на в строчку
DocElement2.innertext;//вернет содержимое без html тегов
DocElement2.innerhtml;//вернет весь внутренний html элемента...
только вот когда обращаешься ко вложенным элементам не разобрался еще как обратится только к оптеделенным тегам (игнорить всех кроме td-то есть вернуть коллекцию из td)
но зато можно узнать имя элемента
DocElement2.tagName
то есть можно когда идем в цикле по дочерней коллекции элементов проверять имена и игнорить не нужные.
это конечно не круто но хоть так чем вообще ни как

чтобы прочитать конкретный атребут элемента можно юзать:
DocElement2.getAttribute('name',0) в первом параметре пищем название атрибута какой нам надо а во втором число, котороя я так пока и не понял для чего служит. подставлял любые-ему пофиг "роли не играет"
как получить список всех атрибутов пока что не разобрался

интересный момент в том что можно даже стиль выдернуть
DocElement2.style и там через точку можно прочитать любой атрибут стиля...
только почему то не цепляется из файла стилей css. видимо это работает только если стиль задан непосредственно в самом теге.
вот интересно кстати а он умеет работать корректно со стилями или нет? если будет перекрытие стилей что он вернет в ответ?

если кому интересно могу потом как аучусь написать статейку (так как толком по русски не где не написано как с этим работать)
Писано по д'Эльфийски

Последний раз редактировалось Лубышев; 24.08.2011 в 12:40.
Лубышев вне форума Ответить с цитированием
Старый 29.08.2011, 20:27   #8
Лубышев
Участник клуба
 
Аватар для Лубышев
 
Регистрация: 23.07.2007
Сообщений: 1,054
По умолчанию

блин наткнулся на загвоздку
DocElement.all as IHTMLElementCollection; возвращает все вложенные элементы и все вложения вложенных элементов. то есть независимо от глубины вложений. как мне узнавать эту глубину? то есть наглядный пример если я в таблице ищу <td> и вдруг окажется так что в этой таблице окажется вложена еще одна таблица то он посчитает и её <td>шки.... а мне так не надо. как учитывать глубину вложенности?
Писано по д'Эльфийски
Лубышев вне форума Ответить с цитированием
Старый 02.09.2011, 00:06   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

наверно стоит применить коллекцию детей?
children такую вернет.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
DOM php5 alexander1111 PHP 0 09.03.2011 22:56
TWebBrowser DOM KASioZ Работа с сетью в Delphi 0 11.12.2009 07:02
Дерево DOM fclmhooligan JavaScript, Ajax 1 24.11.2008 14:11
DOM. save в IE badfilin JavaScript, Ajax 2 01.05.2008 11:20
DOM. как передать HTML разметку badfilin JavaScript, Ajax 3 26.04.2008 20:25