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

Вниз

Поиск в HTML   Найти похожие ветки 

 
oens   (2003-12-03 15:34) [0]

Господа.
Как найти все ссылки в html документе и вывести их
в FileListBox1?


 
Darrin ©   (2003-12-03 15:38) [1]

парсишь документ на предмет наличия текста "href=", то что после него и есть ссылка


 
Ihor Osov'yak ©   (2003-12-03 15:46) [2]

смотреть mshtml.pas
Подробности - в мсдн.
Можешь еще поискать "Использование функциональности IE" на Королевстве Делфи..


 
oens   (2003-12-03 15:57) [3]

Господа, если можно подробнее, я с этой темой впервые работаю.


 
TUser ©   (2003-12-03 17:04) [4]

Вот только что писал
procedure TForm1.JvHTButton1Click(Sender: TObject);
var f,fr,fh:textfile; s,s1:string; count, i:integer;
stre:TMemoryStream; mem:PChar; res:widestring; fl:boolean;
begin
count:=0;
assignFile(f,"C:\evgeniy\pdb\guide\download\toc.txt");
reset(f);
assignfile(fr,"C:\evgeniy\pdb\guide\download\urls");
rewrite(fr);
assignFile(fh,"C:\evgeniy\pdb\guide\download\toc.html");
rewrite(fh);
while not eof(f) do begin
readln(f,s);
if pos("<A href=" http://www.rcsb.org/pdb/docs/format/pdbguide2.2/part",s)=1 then begin
s1:=" http://www.rcsb.org/pdb/docs/format/pdbguide2.2/part"+copy(s,length("<A href=" http://www.rcsb.org/pdb/docs/format/pdbguide2.2/part")+1,20);
i:=pos("" tar",s1);
if i=0 then i:=pos("" tar",s1);
// showMessage(s1+#13+inttostr(i)+" of "+inttostr(length(s1)));
delete(s1,i,length(s1)-i+1);
writeln(fr,s1);
delete(s,9,length(" http://www.rcsb.org/pdb/docs/format/pdbguide2.2/"));
end;
writeln (fh,s);
end;
closefile(f);
closefile(fr);
closefile(fh);

assignfile(f,"C:\evgeniy\pdb\guide\download\urls");
reset(f);
progressbar1.Min:=0;
progressbar1.Max:=count;
progressbar1.Position:=0;
while not eof(f) do begin
readln(f,s);
label1.Caption:="processing "+s;
stre:=TMemorystream.Create;
httpcli1.URL:=s;
httpcli1.Proxy:="";
httpcli1.ProxyPort:="80";
httpcli1.RcvdStream:=stre;
httpcli1.Get;
mem:=stre.Memory;
memo1.Lines.Text:=res;
i:=1; res:=widestring(mem);
while i<length(res) do {begin
showmessage(res[i]+" = "+inttostr(ord(res[i])));
inc(i);
end; }
if (res[i]=#13) or (res[i]=#10) then
delete(res,i,1)
else inc(i);
i:=1; fl:=true;
while (i<length(res)+1) and fl do
if (res[i]="<") and (res[i+1]="A") and (res[i+2]=" ") then begin
insert(#13,res,i);
i:=i+3; end
else
if copy(res,i,7)="</html>" then
i:=length(res)+1
else inc(i);

mem:=PChar(res);
i:=1; s1:="";
i:=pos(".html",s);
assignfile(fh,"C:\evgeniy\pdb\guide\download\"+copy(s,length(" http://www.rcsb.org/pdb/docs/format/pdbguide2.2/")+1,i+len gth(".html")-length(" http://www.rcsb.org/pdb/docs/format/pdbguide2.2/")));
rewrite(fh);
while i<length(res)+1 do begin
if copy(res,i,length("<A href=" http://www.rcsb.org/pdb/docs/format/pdbguide2.2/part"))="<A href=" http://www.rcsb.org/pdb/docs/format/pdbguide2.2/" then begin
write(fh, "<A href=""); inc (i,length("<A href=" http://www.rcsb.org/pdb/docs/format/pdbguide2.2/part"));
end else begin
write (fh,res[i]); inc (i);
end;
end;
closefile (fh);
stre.Free;
progressbar1.Position:=progressbar1.Position+1;
end;
closefile(f);


Глюки есть, но для моих утилитарных целей (скачка некоторого количества страниц) прокатило. Для использования в серьезном проекте надо немного поотлаживать, что несложно. Только учти, что в данном случае я точно знал, как выглядят ссылки на этом сайте. Если же это неизвестно, то придется писать свой маленький парсер, учитывая, что возможно существование например, такой ссылки <a name=... target=... href=...>. Можно использовать готовые парсеры.


 
TUser ©   (2003-12-03 17:06) [5]

Да, совсем забыл. Я предвартельно исходный файл отдельной прогой изменил - убрал все #13 и #10, а потом вставил по #13 перед каждой ссылкой.


 
хамло   (2003-12-03 17:19) [6]

> смотреть mshtml.pas
правильный ответ!


 
lahtak   (2003-12-03 17:36) [7]

Вот готовая процедура (c) Larsen www.euromind.com

procedure GetAnchorList(Ic: IHTMLElementCollection; Anchorlist: TStrings);
var
Anchor: IHTMLAnchorElement;
Disp: IDispatch;
x: Integer;
begin
if IC <> nil then begin
for x := 0 to IC.length - 1 do begin
Disp := IC.item(x, 0);
if SUCCEEDED(Disp.QueryInterface(IHTMLAnchorElement, Anchor))
and (anchor.href <> "")
then Anchorlist.add(Anchor.href);
end;
end;
end;


 
хамло   (2003-12-03 17:52) [8]

2 lahtak

а откуда береться "Ic: IHTMLElementCollection" и что такое "IHTMLAnchorElement" история умалчивает? ))


 
lahtak   (2003-12-03 22:07) [9]

хамло (03.12.03 17:19) [6] > смотреть mshtml.pas
:)
А если серьезно IHTMLAnchorElement - это и есть ссылка в широком
смысле , IHTMLElementCollection берется из
Doc : iHTMLDocument2;
ic:=Doc.get_all;
а документ берется например из браузера , а в полном примере
Ларсена вообще откуда хочешь.


 
oens   (2003-12-04 08:18) [10]

Спаибо. Всем.
Эд.



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

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

Наверх




Память: 0.49 MB
Время: 0.016 c
3-52095
GIL
2003-11-24 13:22
2003.12.16
Имена полей в SQL


14-52372
Dancer
2003-11-10 15:38
2003.12.16
А можно ли написать хорошую игру на Delphi?


1-52172
tvic
2003-12-03 15:45
2003.12.16
Как изменить ширину выпадающего списка у ComboBoxа?


14-52412
filh
2003-11-23 14:40
2003.12.16
проблема с прогой, ошибка


3-52090
SlavaSH
2003-11-24 14:26
2003.12.16
Делфи7