Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2002.10.28;
Скачать: [xml.tar.bz2];

Вниз

Снова вопрос по извлечению текста из сайта   Найти похожие ветки 

 
Руль   (2002-08-27 01:41) [0]

Извините что опять задаю тот-же вопрос но на него ответил один человек и то я ничго не понял из того что он написал. Если можно ссылку на инфо по Субдж.


 
Kornet   (2002-08-27 07:37) [1]

С помощью THTTP берёшь страницу и начинаешь производить с ним строковые операции. Тут полёт фантазии может быть ограничен только твоей фантазией: парсинг, поиск и вырезание и так далее...


 
Song   (2002-08-27 08:22) [2]

Скачай страницу на диск и делай с ней чего хочешь.


 
Ihor Osov'yak   (2002-08-27 17:51) [3]

2 руль - если мне не изменяет память - один чел - то я.

инфо www.users.bit.te.ua\osi - (koi8) - там ссылка на статью.
Читаешь про парсинг, там также есть пример получения IHtmlElement от тега. Так вот, имя тега даешь body - а далее по тексту ... СориЮ готового фрагмента пока не дам - я на чужих територияХ. Разьве что вечерком из дому ...

Далее - IHtmlElement.get_innerText ...

Когда справишся с однофреймовым док - поговорим о многофреймовых


 
Руль   (2002-08-27 23:47) [4]

2Kornet&2Song
Именно это я и сделал, но хотелось более цивилизовано :)

2Ihor Osov"yak У меня эта ссылка не работает, не можешь мне подсказать что такое парсинг и где ещё можно по данному сабджу найти инфо (горит проект)


Всем огромное спасибо что отозвались !!!!!


 
Ihor Osov'yak   (2002-08-28 00:23) [5]

2 Руль
http://delphi.vitpc.com/mastering/tweb.htm

Фрагмент кода через несколько минут .....

2Kornet&2Song - ну, енто, немножко геморно... Тем более, есть возможность плодами трудов MS воспользоватся ...



 
Ihor Osov'yak   (2002-08-28 00:53) [6]

Фрагмент кода. Он проверяет, есть ли на страничке фраза с учетом фреймов. Метод проверки - ищем подстроку в текстовом представлении странички (это тебе нужно - как я говорил раньше - getInnerText). Чего здесь не решено - если фрейм на другом сервере,чем основной документ - то через границу фрейма єтим способом не перепрыгнуть (ограничение парсера от MS по соображениям секюрити). Тогда нужно ловить каждый фрейм к примеру в OnDocumentComplete - но это снова отдельная тема.

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

Да, если не нужно обработки фреймов - весь код можно свести к четырем - пяти строчкам ....

Еще - если полностью копируешь текст - учти - lowerCase кажись для кирилицы не работает ( я то лазил по англ. сайтам)




type
pdataFor_fGetLinkOneFrame = ^dataFor_fGetLinkOneFrame;
dataFor_fGetLinkOneFrame = record
pStr : PString;
iElem:IHtmlElement;
end;


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

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

if not assigned(iDoc) then Exit;
subStr := lowercase(pdataFor_fGetLinkOneFrame(addPrm)^.pStr^);
ov := "A";

IDisp:=iDoc.all.tags(ov);
if assigned(IDisp) then begin
IDisp.QueryInterface(IHTMLElementCollection,iColl);
if assigned(iColl) then begin
for i:=1 to iColl.Get_length do begin
iDisp:=iColl.item(pred(i),0);
iDisp.QueryInterface(IHTMLElement,iElement);
if assigned(iElement) then begin
if Pos(lowercase(SubStr),lowercase(iElement.InnerText))>0
then begin
result := true;
pdataFor_fGetLinkOneFrame(addPrm)^.iElem := iElement;
Exit;
end
end;
end;
end;
end;


end;


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 GetBodyWithSubstr(pDisp: IDispatch; const subStr:string):IHtmlElement;
var iDoc:IHtmlDocument2;
var data:dataFor_fGetLinkOneFrame;

begin
result := nil;

iDoc:=(pDisp as IWebBrowser2).Document as IHtmlDocument2;
if not assigned(iDoc) then Exit;

fillChar(data,sizeof(data),0);
data.pStr := @subStr;
if FinderFirstCondForHtmlDocWithFrames(iDoc,integer(@Data),fGetBobyWitshSbstrOneFrame)
then begin
result := data.iElem;
data.iElem := nil;
end;
data.pStr := nil;

end;





 
Kornet   (2002-08-28 06:51) [7]

2Ihor Osov"yak:
>ну, енто, немножко геморно... Тем более, есть возможность плодами трудов MS воспользоватся ...
Это то конечно, в принципе всё зависит от конкретики задачи, мне хватает 5 строчек кода, что бы вырезать наример финансовые показатели с сайтов... Но согласен, с MS парсером красивее и веселее. :)


 
Ghost.   (2002-08-28 09:17) [8]

Да все правильно IE это такойже ОЛе бьект и с ним можно очень удобно работать и искать строки



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

Форум: "Сети";
Текущий архив: 2002.10.28;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.008 c
7-92763
Flying Bird
2002-08-21 00:12
2002.10.28
Регистрация типа файлов


3-92401
alek123
2002-10-08 14:43
2002.10.28
ODBC


14-92660
Борис
2002-10-07 11:21
2002.10.28
Где скачать полную версию InstallShield


1-92523
Voland1
2002-10-17 17:45
2002.10.28
Глюк IDE или программы? Не там точки компиляции...


7-92745
Werewolfru
2002-08-20 15:18
2002.10.28
Запретить загрузку Windows?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский