Модераторы: MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск текста в фреймах WebBrowser, вообщем вот такой вопрос 
:(
    Опции темы
Vardoulacha
Дата 15.11.2005, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 184
Регистрация: 11.8.2005

Репутация: 1
Всего: 8



Народ тут такой вопрос родился, а как можно найти определенный текст в HTML коде или на странице, просто нужно узнать загрузилась ли нужная страница (поиск по ключевому слову) или нет... при этом в TWebBrowser выводится страница основанная на фреймах

я пробовал перебрать все ссылки на фреймах, сохранить содержимое всех фреймов на винт в виде текста ничего из этого не выходит (именно на этом сайте на других эти две процедуры нормально работают)

может как-то еще можно узнать содержимое нужного фрейма
PM MAIL   Вверх
_hunter
Дата 15.11.2005, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 2
Всего: 98



у фрейма проси IHTMLDocument2 у него get_body ( получиш IHTMLElement ) а там innerText/innerHTML
( это по поводу поиска )


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Vardoulacha
Дата 16.11.2005, 07:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 184
Регистрация: 11.8.2005

Репутация: 1
Всего: 8



Цитата(_hunter @ 15.11.2005, 12:54)
у фрейма проси IHTMLDocument2 у него get_body ( получиш IHTMLElement ) а там innerText/innerHTML
( это по поводу поиска )

вот что я смог сварганить из тех примеров, что нашел но так и не смог найти как выбрать innerText/innerHTML???

функция типа вроде должна находить нужный мне фрейм он под номером 0 среди списка фреймов страницы

Код

 function TMainForm.GetFrame(FrameNo: Integer): IWebbrowser2;
 var
   OleContainer: IOleContainer;
   enum: IEnumUnknown;
   unk: IUnknown;
   Fetched: PLongint;
 begin
   while Webbrowser1.ReadyState <> READYSTATE_COMPLETE do
     Application.ProcessMessages;
   if Assigned(Webbrowser1.document) then
   begin
     Fetched := nil;
     OleContainer := Webbrowser1.Document as IOleContainer;
     OleContainer.EnumObjects(OLECONTF_EMBEDDINGS, Enum);
     Enum.Skip(FrameNo);
     Enum.Next(1, Unk, Fetched);
     Result := Unk as IWebbrowser2;
   end
   else
     Result := nil;
 end;

//Здесь сама процедура когда загружен весь документ
procedure TMainForm.WebBrowser1DocumentComplete(Sender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
var
  iDoc : IHtmlDocument2;
  iDisp : IDispatch;
  iElement : IHTMLElement;
  iw: IWebbrowser2;
begin
  RichEdit1.Clear; //очистка richedit
  iw := GetFrame(0); //получение 0-го фрейма
  iDoc:=iw.document as IHtmlDocument2; //получение html документа
  iDisp:=iDoc.Get_body; //получение тела
  iDisp.QueryInterface(IHTMLElement, iElement); //получение элементов
  ... //здесь я понял надо как то теперь получить этот текст а как???
  RichEdit1.Lines.Add(...); //и занести его в richedit
end;


млин никогда такими вещами не занимался даже не знаю с чего начать, а где можно найти описание всех этих IHtmlDocument2, IHTMLElement, Get_body???
PM MAIL   Вверх
Vardoulacha
Дата 17.11.2005, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 184
Регистрация: 11.8.2005

Репутация: 1
Всего: 8



фига се я написал чтобы можно было выдрать текст или html из любого фрейма (на других сайтах работает безотакзно а на нужном мне не работает что там за защита в теле стоит... ооо... кстати надо бы почитать может там какая-то защита стоит какой-нить скриптик или свойство)

если кому-то пригодится вот рабочий код

Код

uses mshtml, activex;

//функция находит нужный фрейм по его номеру
 function TMainForm.GetFrame(FrameNo: Integer): IWebbrowser2;
 var
   OleContainer: IOleContainer;
   enum: IEnumUnknown;
   unk: IUnknown;
   Fetched: PLongint;
 begin
   while Webbrowser1.ReadyState <> READYSTATE_COMPLETE do
     Application.ProcessMessages;
   if Assigned(Webbrowser1.document) then
   begin
     Fetched := nil;
     OleContainer := Webbrowser1.Document as IOleContainer;
     OleContainer.EnumObjects(OLECONTF_EMBEDDINGS, Enum);
     Enum.Skip(FrameNo);
     Enum.Next(1, Unk, Fetched);
     Result := Unk as IWebbrowser2;
   end
   else
     Result := nil;
 end;

procedure TMainForm.WebBrowser1DocumentComplete(Sender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
var
  iw: IWebbrowser2;
  iDoc : IHtmlDocument2;
begin
  RichEdit1.Clear; //очистка richedit
  iw := GetFrame(0); //получение 0-го фрейма
  iDoc:=iw.document as IHtmlDocument2; //получение документа
  RichEdit1.Lines.Add(iDoc.body.innerText); //отображение только текста в теле страницы если нужно html код замените innerText на innerHTML
end;

PM MAIL   Вверх
Vardoulacha
Дата 17.11.2005, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 184
Регистрация: 11.8.2005

Репутация: 1
Всего: 8



все народ я решил свою проблему именно с нужным мне сайтом если кому интересно вот рабочий код (оказывается все гениальное просто я обратился не по индексу фрейма, а по его имени и спокойно получил текст)

опять же повторяю если вам нужен полный html код тогда нужно в процедуре поменять InnerText на InnerHTML

Код

uses
  mshtml;

procedure Source;
var
    HTML_Doc: IHTMLDocument2;
      Window: IHTMLWindow2;
  name_frame: OleVariant;
begin
  MainForm.RichEdit1.Clear;
  HTML_Doc:=MainForm.WebBrowser1.Document as IHTMLDocument2;
  Window:=HTML_Doc.parentWindow as IHTMLWindow2;
  name_frame:='head';
  MainForm.RichEdit1.Lines.Add(Window.frames.item(name_frame).document.body.InnerText);
end;


Это сообщение отредактировал(а) Vardoulacha - 17.11.2005, 14:53
PM MAIL   Вверх
December
Дата 3.12.2005, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antitheorist
****


Профиль
Группа: Участник
Сообщений: 4423
Регистрация: 14.8.2002
Где: Харьков

Репутация: 12
Всего: 57



Цитата(Vardoulacha @ 17.11.2005, 09:55)
на других сайтах работает безотакзно а на нужном мне не работает что там за защита в теле стоит

Если не секрет - в чём была проблема и как она проявлялась?
Цитата(Vardoulacha @ 17.11.2005, 14:53)
MainForm.RichEdit1.Lines.Add(Window.frames.item(name_frame).document.body.InnerText);

Это самый простой и удобный путь, но, к сожалению, он не работает в случаях Cross-site scripting.


--------------------
Для друзей с винграда - скидки на разработку сайтов
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: ActiveX/СОМ/CORBA"

Rrader
Girder

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Delphi
  • Вопросы по SQL и вопросы по базам данных, не связанные с Delphi, задавать здесь

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: ActiveX/СОМ/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0596 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.