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

Вниз

Есть html код. Как из него выдрать ссылки?   Найти похожие ветки 

 
Феликс ©   (2002-07-07 11:33) [0]

Хотя бы в каком направление копать? А совсем хороше бы было если бы исходник кто-нибудь дал посмотреть!


 
Shrek ©   (2002-07-07 12:33) [1]

Я впринципе не спец но я бы зледал это так:
Берёш строку, потом в этой строке ищеш текст. "href"

X := Pos("href", "Твоя строка").

Потом отсюда и копаеш.

P.S. Не осудите срого если что не так но я бы так и сделал.


 
MBo ©   (2002-07-07 12:35) [2]

по простому - использовать Pos, искать href, < > "
Можно попробовать и регулярные выражения (статья есть на delphi.vitpc.com)


 
Коля ©   (2002-07-07 12:50) [3]

не совсем так. в html ссылки пишутся вот так:
href=" http://www.rambler.ru"

а вот такой код по идее должен найти эти ссылки:

i:= Pos("href", Text) + 7
while Text[i] <> """ do
begin
link:= link + text[i]
i:=i+1;
end;

так программа запишет только первую ссылку, сделай цикл чтобы она нашла все.


 
Shrek ©   (2002-07-07 12:57) [4]

> Коля
Ну а если кто поставит пробелы типа
href = " http://www.rambler.ru"


 
Феликс ©   (2002-07-07 13:24) [5]

Эксперименты с выше указанным кодом дали отрицательный результат! Не первую, не вторую не находит! Дает ошибку! Мне тоже кажется, что pos,copy и.т.д в данном случае единственные варианты! Осталось самое простое: оформить в виде кода. Но как?


 
Shrek ©   (2002-07-07 13:50) [6]

Могу помочь. Но я тебе а ты мне.
Я тебе деляю пример с Pos и Copy с розяснением.
Аты посмотреш мой вопрос о ClientSocketError.
Если согласень давай на мыло.


 
Стою на базаре, семечки продаю   (2002-07-07 15:05) [7]

Вот эт я понимаю рыночные отношения!


 
Коля ©   (2002-07-07 15:07) [8]

Вот! теперь должно работать, правдо код довольно запутанный... Читаешь файл в text

var
i,ii:integer;
link:string; text:WideString;
exist:boolean;
begin
while Pos("href", text) > 0 do
begin
i:=Pos("href", text);
while text[i] <> """ do
i:=i+1;
Delete(text,0,i);
i:=1;
while text[i] <> """ do
begin
link:=link+text[i];
i:=i+1;
end;
//записываешь линк куда тебе надо
link:="";
end;
end;


 
Коля ©   (2002-07-07 15:09) [9]

оппа этот exist:boolean; вообще из другой истории...


 
Anatoly Podgoretsky ©   (2002-07-07 15:40) [10]

Да а если кавычек не будет, и таких да много
В Дельфи есть специальная вещь "TWebBrouser" если его освоить, то эта проблема решается в нем уже на системном уровне


 
Феликс ©   (2002-07-07 15:40) [11]

var
i,ii:integer;
link:string; text:WideString;

begin
text:=memo1.Lines.Text;
while Pos("href",text) > 0 do
begin
i:=Pos("href", text);
while text[i] <> """ do
i:=i+1;
Delete(text,0,i);
i:=1;
while text[i] <> """ do
begin
link:=link+text[i];
i:=i+1;
end;
listbox1.items.add(link);
//записываешь линк куда тебе надо
link:="";

end;
end;

в memo1 находится html код! Так вот! Данный код! Зверски записывает в листбох первую строку этого самого html кода! Во как! Что делать?


 
Феликс ©   (2002-07-07 15:43) [12]

> Коля
У тебя у самого код то работает?


 
Коля ©   (2002-07-07 16:05) [13]

Извини! я описался- не Delete(text,0,i); а Delete(text,1,i);


 
Феликс ©   (2002-07-07 16:26) [14]

2 Коля
Земной тебе поклон, Коля! Код работает лучше чем моя потовыделительная система (а потовыделительная система у меня зашибись тьфу-тьфу-тьфу)! Еще раз Спасибо и Большой тебе респект за труды, трату времени, и помощь моей скромной персоне!


 
int64 ©   (2002-07-07 18:59) [15]

Вам же говорят, что линки не всегда в кавычках, да ещё в двойных.
Тем более, что html код может создаваться динамически (через document.write, например). А о фреёмах я вообще не говорю.

Вот как через IE:
procedure TForm1.Button1Click(Sender: TObject);
var
Coll: IHtmlElementCollection;
V: OleVariant;
i: Integer;
IE: IDispatch;
begin
if InitProc <> nil then TProcedure(InitProc);
IE := CreateOleObject("InternetExplorer.Application");
With (IE as IWebBrowser),(IE as IWebBrowser2) do
begin
Visible := false;
Navigate("c:\temp\index.html",v,v,v,v);
while Busy do sleep(0);
Coll:= (document as IhtmlDocument2).all.tags("a")
as IHtmlElementCollection;
end;
for i:=0 to Coll.length-1 do
with (Coll.item(i,v) as IHTMLAnchorElement) do
if (href <> "") then
begin
Memo1.Lines.add("href: "+href);
Memo1.Lines.add("host: "+host);
Memo1.Lines.add("hostname: "+hostname);
Memo1.Lines.add("port: "+port);
Memo1.Lines.add("protocol: "+protocol);
Memo1.Lines.add("nameProp: "+nameProp);
Memo1.Lines.add("pathname: "+pathname);
Memo1.Lines.add("");
end;
end;


Если доработать, будет и во фреймах искать.

Дерзай.


 
Феликс ©   (2002-07-07 21:17) [16]

IE := CreateOleObject("InternetExplorer.Application");
Говорит Missing operator or semilicon! Вот так вот.


 
Феликс ©   (2002-07-07 23:01) [17]

Ага! Разобрался. Нужно было добавить Comobj в uses. Только код по прежнему не работает!

if InitProc <> nil then TProcedure(InitProc);
IE:=CreateOleObject("InternetExplorer.Application");
With (IE as IWebBrowser),(IE as IWebBrowser2) do
begin
Visible := false;
Navigate("temp.htm",v,v,v,v);
while Busy do sleep(0);
Coll:= (document as IhtmlDocument2).all.tags("a")
as IHtmlElementCollection;
end;
for i:=0 to Coll.length-1 do
with (Coll.item(i,v) as IHTMLAnchorElement) do
if (href <> "") then
begin
Memo1.Lines.add("href: "+href);
Memo1.Lines.add("host: "+host);
Memo1.Lines.add("hostname: "+hostname);
Memo1.Lines.add("port: "+port);
Memo1.Lines.add("protocol: "+protocol);
Memo1.Lines.add("nameProp: "+nameProp);
Memo1.Lines.add("pathname: "+pathname);
Memo1.Lines.add("");
end;
end;

Coll:= (document as IhtmlDocument2).all.tags("a") <- Говорит неподнаная ошибка!


 
Феликс ©   (2002-07-07 23:03) [18]

Это опять я! Вроде бы разобрался! Спасибо int64. Способ хороший, но есть еще лучше. В любом случае, спасибо этот способ тоже очень не плохой!



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

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

Наверх




Память: 0.51 MB
Время: 0.009 c
14-58257
Goblinus
2002-06-19 21:49
2002.07.18
5 небольших вопросиков


1-58214
SerVS
2002-07-07 00:55
2002.07.18
Проводник


14-58265
Igor_thief
2002-06-20 14:59
2002.07.18
Try2hack


4-58363
МишА
2002-05-15 20:42
2002.07.18
SendMessage в Dos приложение


1-58216
Doctor Deejay
2002-07-06 19:29
2002.07.18
Как сделать шустрый ProgressBar с шагом в 1% ?