Delphi урок - учимся парсить ссылки на странице

Опубиковано: 17.11.2011 г., автор: , просмотров: 33721

В этом небольшом уроке я покажу вам как можно легко парсить все ссылки на web странице.
Итак, открываем Delphi и создаем новый проект.
Лично я для данного урока использовал Delphi 2010,
Поэтому, если у вас на компьютере установлена другая версия, возможно придется самостоятельно немного поправить код.
Для начала в раздел uses подключаем следующие библиотеки:

mshtml, ActiveX, COMObj, IdHTTP, idURI;

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

procedure ExtractLinks (const url: String; const strings: TStrings) ;

Далее нажимаем уже знакомую нам комбинацию клавиш CTRL+Shift+C в результате чего Delphi сгенерирует нам шаблон для будущей процедуры.

Объявляем локальные переменные

var
iDoc : IHTMLDocument2;
strHTML : string;
v : Variant;
x : integer;
links : OleVariant;
docURL : string;
URI : TidURI;
aHref : string;
idHTTP : TidHTTP;

В теле процедуры тоесть между Begin ... end пишем следующий код:

strings.Clear;
URI := TidURI.Create(url) ;
try
docURL := 'http://' + URI.Host;
if URI.Path <> '/' then docURL := docURL + URI.Path;
finally
URI.Free;
end;
iDoc := CreateComObject(Class_HTMLDOcument) as IHTMLDocument2;
try
iDoc.designMode := 'on';
while iDoc.readyState <> 'complete' do Application.ProcessMessages;
v := VarArrayCreate([0,0],VarVariant) ;
idHTTP := TidHTTP.Create(nil) ;
try
strHTML := idHTTP.Get(url) ;
finally
idHTTP.Free;
end;
v[0]:= strHTML;
iDoc.write(PSafeArray(System.TVarData(v).VArray)) ;
iDoc.designMode := 'off';
while iDoc.readyState<>'complete' do Application.ProcessMessages;
links := iDoc.all.tags('A') ;
if links.Length > 0 then
begin for x := 0 to -1 + links.Length do
begin
aHref := links.Item(x).href;
if (aHref[1] = '/') then
aHref := docURL + aHref
else if Pos('about:', aHref) = 1
then aHref := docURL + Copy(aHref, 7, Length(aHref)) ;
strings.Add(aHref) ;
end;
end;
finally
iDoc := nil;
end;

Так с основными приготовлениями мы закончили, и очень скоро наш робот игрушка покажет себя в действии. А сейчас давайте кинем на форму 3 компонента с закладки Standard: Edit, Button, Memo

Если кто не понял, в компонент Edit мы будем вводить нужный URL адрес, а после нажатия на кнопку в memo будут отображаться все ссылки с указанной Web страницы.

Напоследок, создадим обработчик событий OnClick на кнопке, в котором вызовем нашу процедуру с нужными параметрами (между begin ... end пишем)

ExtractLinks(Edit1.Text, memo1.Lines);

Вот в принципе и все запускаем и компилируем проект.

 

P.S. Хотите вперед всех остальных посетителей сайта получать свежие Видео уроки, Аудио подкасты, статьи по Delphi.
Участвовать в конкурсах и постепенно вливаться в нашу команду ?!
Тогда прямо сейчас подписывайтесь на бесплатную мультимедийную рассылку сайта delphiexpert.ru
Нас уже больше чем 10000 человек ! Подписаться



Похожие материалы

Последние из рубрики

Евгений 21 Jul 2012 в 00:00 #
Хорошие статьи и исходники. Благодарю - много узнал полезного и эффективного.
Хотелось бы посмотреть на исходник (рабочий) почтовой программы позволяющей корректно принимать и отправлять почту со вложением.

Узнать о работе с API
admin 07 Apr 2012 в 00:00 #
Я не админ, я только учусь.
Andrew 29 Mar 2012 в 00:00 #
У кого ошибки, у того, наверное, другая версия Delphi, чем 2010. У меня работает на Delphi XE.
Сергей 11 Jan 2012 в 00:00 #
Здравствуйте, подскажите пожалуйста)
Выдает такую вот ошибку:
[Предупреждение] Form.pas(179): Unsafe type ′PChar′
[Предупреждение] Form.pas(507): For loop control variable must be simple local variable
[Ошибка] Form.pas(727): Undeclared identifier: ′VarArrayCreate′
[Предупреждение] Form.pas(735): Unsafe typecast of ′Variant′ to ′TVarData′
[Фатальная ошибка] Form.pas(6): Could not compile used unit ′Form′

Работаю на Delphi 7. Как обойти эту ошибку?, и насколько результаты предложенной вами функции будут отличаться от результатов компонента RegExpr.pas
Буду благодарен за ответ, и любые советы по преодолению проблемы.
vavilov8 27 Nov 2011 в 00:00 #
Полезная статья! Почему так долго не было уроков?

ОтменитьДобавить комментарий