Главная страница
    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.58 MB
Время: 0.035 c
3-92327
mav13
2002-10-02 17:09
2002.10.28
BDE Administrator. Проблема с паролем.


3-92362
ppcat
2002-10-07 11:56
2002.10.28
MS SQL Server и dbf


3-92381
lightix
2002-10-08 10:36
2002.10.28
Подскажите, как заставить программно DBGRID завершить ввод?


14-92669
Polevi
2002-10-07 13:14
2002.10.28
руки бы автору томатоса поотрывал, слов нет, №;Е№:;%


1-92428
PalP
2002-10-17 12:03
2002.10.28
MDI панель. Кто встречал?





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