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

Вниз

Поиск в 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.009 c
1-52186
TUser
2003-12-03 13:24
2003.12.16
onTop


1-52271
Альф
2003-12-03 17:14
2003.12.16
Странное поведение TabControl


1-52149
KF111
2003-12-02 20:32
2003.12.16
Позиция курсора в TMemo


3-52102
Senator
2003-11-24 12:01
2003.12.16
Как к результату запроса ADOquery применить sql запрос


1-52158
sowell
2003-12-03 16:45
2003.12.16
DBCtrlGrid и его панели





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