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

Вниз

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

Наверх





Память: 0.48 MB
Время: 0.007 c
1-58051
Merry
2002-07-01 15:26
2002.07.18
Цвет текста в DBRich


1-58123
Cola
2002-07-08 22:12
2002.07.18
Как посмотреть все сообщения произвольного человека.


14-58286
SeF
2002-06-21 03:24
2002.07.18
ловля багов


1-58114
alxx
2002-07-08 14:51
2002.07.18
COM server warning


3-58016
TAT_K
2002-06-27 16:41
2002.07.18
InterBase Expres и базы данных





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