Форум: "Потрепаться";
Текущий архив: 2003.07.24;
Скачать: [xml.tar.bz2];
ВнизС помощью чего можно получить 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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.008 c