Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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.009 c
14-78053
Alexsey Orlov
2003-07-09 21:15
2003.07.24
Помогите


1-77845
AndrewVolkov
2003-07-10 00:03
2003.07.24
Чужая DLL - использование???


3-77751
DenK_vrtz
2003-07-01 16:04
2003.07.24
Кто сталкивался с проблемой?


3-77802
zep
2003-07-02 23:24
2003.07.24
работа с Alias


1-77916
#Helpme
2003-07-10 12:38
2003.07.24
TEdit





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский