Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.07.24;
Скачать: CL | DM;

Вниз

С помощью чего можно получить HTML-код интернет-страницы...   Найти похожие ветки 

 
Kiril   (2003-07-06 18:15) [0]

Подскажите где хотя-бы копать?

Спасибо


 
Palladin ©   (2003-07-06 18:30) [1]

Копай на палитре компанентов


 
Ihor Osov'yak ©   (2003-07-06 18:40) [2]



TWebBrowser, можно еще посмотреть mshtml, IHtmlDocument2

далее

function SaveToString(const WebBrowser: IWebBrowser2): string;
var
S: TStringStream;
begin
S := TStringStream.Create("");
try
(WebBrowser.Document as IPersistStreamInit).Save(TStreamAdapter.Create(S), True);
Result := S.DataString;
finally
S.Free;
end;
end;



TStringStream, IPersistStreamInit - где то в районе classes, activex


 
Song ©   (2003-07-06 18:44) [3]

NMHTTP.Get()


 
Ihor Osov'yak ©   (2003-07-06 18:44) [4]

Зы - имея в руках экземпляр TWebBrowser, для получения IWebBrowser2 можно обратить внимание на DefaultInterface..


 
Ihor Osov'yak ©   (2003-07-06 18:51) [5]

2 Song © (06.07.03 18:44)

В общем случае на странице могут выполнятся всякие скрипты, которые могут изменить ее код. Поэтому, способ предложеный мною, позволяет получить код того, что видим, вами - тот, что дает сервер.. Что человеку больше подходит в его ситуации - ему лучше видно....


 
Marser ©   (2003-07-06 22:08) [6]

Я в ауте :-))


 
Ihor Osov'yak ©   (2003-07-06 22:15) [7]

А чого?

Ну вопрос немного, согласен, простаковат.. Но ответы вполне..

Есть еще много других способов, без компонентоюзания, много чего можно рассказывать ..


 
Marser ©   (2003-07-06 22:20) [8]


> Ihor Osov"yak ©

А через текстовые файлы ему слабо?


 
Ihor Osov'yak ©   (2003-07-06 22:30) [9]

2 Marser © (06.07.03 22:20)

Априори понимается, что ее нужно поначалу с инета стятнуть.. Как текстовый файл в инете не откроешь..


 
Marser ©   (2003-07-06 22:33) [10]


> Ihor Osov"yak © (06.07.03 22:30)
> 2 Marser © (06.07.03 22:20)
>
> Априори понимается, что ее нужно поначалу с инета стятнуть..
> Как текстовый файл в инете не откроешь..

"Не знаю, може й так"(с)


 
Kiril   (2003-07-07 00:19) [11]

Вот, что я накопал... (не без вашей помощи)
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, OleCtrls, SHDocVw, HTTPApp, SHDocVw_TLB, MSHTML_TLB;


Здесь SHDocVw_TLB, MSHTML_TLB библиотеки импортированные из dll каталога System (System32). Но у меня их импортировать не получилось, я их просто нашёл на диске с компонентами...

[Пропущено]
FAll: IHTMLElementCollection;
A, B, C, D: OleVariant;

[Пропущено]
procedure TForm1.BitBtn1Click(Sender: TObject);
var Doc:IHTMLDocument2;
Len, i :integer;
begin
WebBrowser1.Navigate("C:\TVplus.htm", A, B, C, D);
Doc := WebBrowser1.Document as IHTMLDocument2;
If Doc <> nil then begin
FAll:= Doc.all;
Len := FAll.Length;
for i := 0 to Len - 1 do begin
A := FAll.Item(i, varEmpty);
Memo1.Lines.Add(A.OuterText);
Memo2.Lines.Add(A.OuterHTML);
end;
end;
ComboBox1.ItemIndex := 0;
end;


???? --- Это всё хорошо, но вот возникает вопрос, ????

А если на странице фреймы, как можно получить код непосредственно страницы которая загружается во фрейм? Может не понятно выразился пишите, объясню...


 
Kiril   (2003-07-07 00:25) [12]

Ihor Osov"yak
Вы написали, шо можно получить непосредственно то что выдает на экран не зависимо от скриптов и как я предпологаю фреймов...


> В общем случае на странице могут выполнятся всякие скрипты,
> которые могут изменить ее код. Поэтому, способ предложеный
> мною, позволяет получить код того, что видим, вами - тот,
> что дает сервер.. Что человеку больше подходит в его ситуации
> - ему лучше видно....


И еще, если чесно то я не совсем смог разобрать код представленный вами выше через Stream...



> Зы - имея в руках экземпляр TWebBrowser, для получения IWebBrowser2
> можно обратить внимание на DefaultInterface..



 
Ihor Osov'yak ©   (2003-07-07 00:45) [13]

2 Kiril

Не делай так:

>FAll:= Doc.all;
Len := FAll.Length;
for i := 0 to Len - 1 do begin
A := FAll.Item(i, varEmpty);
Memo1.Lines.Add(A.OuterText);
Memo2.Lines.Add(A.OuterHTML);


Дело в том, что OuterText, OuterHTML включает текст вложенных тегов..
И текст вложенных тегов будет фигурировать несколько раз.. Первый раз - как внутренности самого вишестоящего тега, последний - как его собственный. С включением "отпечатков" от всех промежуточных вышестоящих .. Написал смутно, на запусти код на выполнение для простелькой страницы с несколькими вложенными тегами и все поймешь сам..

>А если на странице фреймы, как
> и как я предпологаю фреймов...

Нет. Такими способами нужно обрабатывать каждый фрейм. Пример как это сделать - ниже:

unit fIEFrames;

interface
uses Mshtml;

type
TOneStepSearchCondForHtmlDocWithFrames = function (iDoc:IHtmlDocument2; addPrm:integer):boolean;

function FinderFirstCondForHtmlDocWithFrames(iDoc:IHtmlDocument2;
addPrm:integer;
aDoer:TOneStepSearchCondForHtmlDocWithFrames):boolean;

function FinderLastCondForHtmlDocWithFrames(iDoc:IHtmlDocument2;
addPrm:integer;
aDoer:TOneStepSearchCondForHtmlDocWithFrames):boolean;


implementation

uses sysutils;

function FinderFirstCondForHtmlDocWithFrames(iDoc:IHtmlDocument2;
addPrm:integer;
aDoer:TOneStepSearchCondForHtmlDocWithFrames):boolean;
{ The procedure aDoer will be caused for each IHtmlDocument2, beginning
from main and finishing any level of frames
while aDoer will return false;
}
var frames:IHTMLFramesCollection2;
i:integer;
ov1:OleVariant;
iDisp:IDispatch;
IWindow2:IHTMLWindow2;
begin
result := false;
if not assigned(aDoer) then Exit;
result:=aDoer(iDoc,addPrm);
if result then Exit;
frames:=iDoc.frames;
if not assigned(frames) then exit;
if frames.length=0 then exit;
//i:= frames.length;
//Writeln("i=",IntToStr(i));
for i:=1 to frames.length do begin
ov1:=i-1;
try
iDisp:=frames.item(ov1);
iDisp.QueryInterface(IHTMLWindow2,IWindow2);
if assigned(IWindow2)
then begin
result := false;
try
if assigned(IWindow2.document)
then
result := FinderFirstCondForHtmlDocWithFrames(IWindow2.document,addPrm,aDoer);
except
end;
if result then exit;
end;
except
{ ShowMessage("Find error !!!");}
end;
end;
end;



function FinderLastCondForHtmlDocWithFrames(iDoc:IHtmlDocument2;
addPrm:integer;
aDoer:TOneStepSearchCondForHtmlDocWithFrames):boolean;
{ The procedure aDoer will be caused for each IHtmlDocument2, beginning
from main and finishing any level of frames
while aDoer will return false;
}
var frames:IHTMLFramesCollection2;
i:integer;
ov1:OleVariant;
iDisp:IDispatch;
IWindow2:IHTMLWindow2;
begin
result := false;
if not assigned(aDoer) then Exit;
result:=aDoer(iDoc,addPrm);
if result then Exit;
frames:=iDoc.frames;
if not assigned(frames) then exit;
if frames.length=0 then exit;
//i:= frames.length;
//Writeln("i=",IntToStr(i));
for i:=frames.length downto 1 do begin
ov1:=i-1;
try
iDisp:=frames.item(ov1);
iDisp.QueryInterface(IHTMLWindow2,IWindow2);
if assigned(IWindow2)
then begin
result := false;
try
if assigned(IWindow2.document)
then
result := FinderLastCondForHtmlDocWithFrames(IWindow2.document,addPrm,aDoer);
except
end;
if result then exit;
end;
except
{ ShowMessage("Find error !!!");}
end;
end;
end;




end.




 
Ihor Osov'yak ©   (2003-07-07 00:56) [14]


Итераторам передаешь функцию, которую нужно примепить к каждому фрейму ..

function FinderFirstCondForHtmlDocWithFrames(iDoc:IHtmlDocument2;
addPrm:integer;
aDoer:TOneStepSearchCondForHtmlDocWithFrames):boolean;

function FinderLastCondForHtmlDocWithFrames(iDoc:IHtmlDocument2;
addPrm:integer;
aDoer:TOneStepSearchCondForHtmlDocWithFrames):boolean;

Не очень удачный пример (нет времени на оптимизацию, но основная идея должна быть понятна ):



pdataFor_getTextAllFrames = ^dataFor_getTextAllFrames;
dataFor_getTextAllFrames = record
sStr : string;
end;


function fGetAllHTMOneFrame(iDoc:IHtmlDocument2; addPrm:integer):boolean;

var
ov:OleVariant;
iDisp: IDispatch;
iColl:IHTMLElementCollection;
iElement:IHTMLElement;
i:integer;
//subStr:string;
tag:string;
begin
result := false;
if addPrm=0 then Exit;

if not assigned(iDoc) then Exit;
tag := "BODY";
ov := tag;

IDisp:=iDoc.all.tags(ov);
if not assigned(IDisp) then exit;
IDisp.QueryInterface(IHTMLElementCollection,iColl);
if not assigned(iColl) then exit;

for i:=1 to iColl.Get_length do begin
iDisp:=iColl.item(pred(i),0);
if not assigned(iDisp) then continue;
iDisp.QueryInterface(IHTMLElement,iElement);
if not assigned(iElement) then continue;
try
with pdataFor_getTextAllFrames(addPrm)^ do
sStr := sStr + iElement.outerHTML;
except
end;
end;
end;


function GetHtmlAllFrames2(iDoc:IHtmlDocument2):string;
var data:dataFor_getTextAllFrames;
begin
result := "";

if not assigned(iDoc) then Exit;

fillChar(data,sizeof(data),0);
data.sStr:="";

if FinderFirstCondForHtmlDocWithFrames(iDoc,integer(@Data),fGetAllHTMOneFrame)
then begin
result := data.sStr;
end;

data.sStr :="";

end;



iDoc, передаваемый в GetHtmlAllFrames2, получаем от TWebBrowser.DefaultInterface.Document.

Обрати внимание на fGetAllHTMOneFrame - там альтернативный твоему способ получения содержимого от тега BODY.. Тебе наверное лучше использовать тег HTML. Но я все же отдал бы предпочтение использованию SaveToString (см. мой первый постинг) вместо fGetAllHTMOneFrame ...


 
Kiril   (2003-07-07 13:36) [15]

Разбирался с кодом, написал следующее:

Doc := WebBrowser1.Document as IHTMLDocument2;
Memo1.Text:=(GetHtmlAllFrames2(Doc));


Но по телу функции отладчик не идёт, выходит на строчке:

if not assigned(iDoc) then Exit;



Страницы: 1 вся ветка

Текущий архив: 2003.07.24;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.014 c
1-77867
Sour
2003-07-10 10:44
2003.07.24
Как работать с реестром напрямую, не используя TRegistry


3-77780
IGOR_1
2003-07-02 14:39
2003.07.24
поиск dbf


14-78147
OldFrits
2003-07-07 16:30
2003.07.24
Технология доступа к базе данных


1-77937
wef
2003-07-10 14:46
2003.07.24
Потоки


14-78111
nick-from
2003-07-08 16:08
2003.07.24
чем лучше всего воспользоваться для преобразования