Перед нами стоит задача получить содержимое HTML кода сайта. Например, нужно вытащить текст, который находится в title.
Для решения поставленной задачи, мы будем использовать компоненты IdHTTP, IdSSLIOHandlerSocketOpenSSL, процедуру delete, функции pos и length.
Также, если мы будем работать с сайтом, который передает данные по защищённому протоколу (HTTPS, использует SSL сертификат), нужно скачать и добавить в папку с проектом два dll файла – ssleay32.dll и libeay32.dll (для разных версий Windows требуются разные версии этих библиотек. Я даю вам ссылку на те файлы, которые отлично работают у меня на Windows 10).
Получение HTML кода страницы сайта и его парсинг
Для решения поставленной задачи, нужно создать форму и поместите на неё следующие компоненты:
- Edit1
- Button1
- Memo1
- Memo2
- IdHTTP1
- IdSSLIOHandlerSocketOpenSSL1
Далее в свойстве IOHandler компонента IdHTTP1 нужно выбрать IdSSLIOHandlerSocketOpenSSL1.
Для события кнопки Button1 OnClick пишем следующий код:
var
a: String;
begin
a := IdHTTP1.Get(Edit1.Text);
Memo1.Text:=a;
Delete(a,1,pos('<title>',a)+length('<title>')-1);
Delete(a,pos('</title>',a),length(a));
Memo2.Lines.Text:=a;
end;
Результат!
Если мы запустим нашу программу, вставим в поле Edit адрес нашего сайта (например, https://d-nik.site) и нажмём на кнопку Button, то получим в Memo1 HTML код главной страницы сайта, а в Memo2 – содержимое тега title (Довідник програміста та розробника сайтів — D-Nik Site).
Внимание!
Не забудьте скачать и поместить в папку с программой библиотеки ssleay32.dll и libeay32.dll. Иначе, если адрес сайта будет начинаться с HTTPS, то программа будет выдавать ошибку Exception class EIdIOHandlerPropInvalid with message 'IOHandler value is not valid'.
Единственным недостатком вышеприведённого кода, является то, что он прекращает парсинг после получения первого результата. То есть, если, например нам нужно будет вытащить со страницы всё что заключено в тег h2, ини получить все ссылки которые есть на странице, то код из примера выше нам в этом не поможет. Он прекратит парсинг, сразуже как только найдёт первый тег h2, или ссылку.
Для парсинга нескольких однотипных значений можно использовать цикл while ... do.
Пример парсинга текста из тега h2
procedure TForm1.Button1Click(Sender: TObject);
var
Source: string;
begin
try
Source := IdHTTP1.Get('https://d-nik.site');
while Pos('<h2 itemprop="name">', Source) <> 0 do begin
Delete(Source, 1, Pos('<h2 itemprop="name">', Source) + Length('<h2 itemprop="name">') - 1);
Memo2.Lines.Add(Copy(Source, 1, Pos('</h2>', Source) - 1));
Application.ProcessMessages;
end;
except
MessageDlg('Произошла ошибка!!!', mtError, [mbOK], 0);
end;
end;
В данном примере, программа получит код HTML страницы и осуществит поиск на ней всего что находится между тегами <h2 itemprop="name"> и </h2>.
Получаем все ссылки с HTML документа
procedure TForm1.Button1Click(Sender: TObject);
var
Source: string;
begin
try
Source := IdHTTP1.Get('https://d-nik.site');
while Pos('href="', Source) <> 0 do begin
Delete(Source, 1, Pos('href="', Source) + Length('href="') - 1);
Memo2.Lines.Add(Copy(Source, 1, Pos('"', Source) - 1));
Application.ProcessMessages;
end;
except
MessageDlg('Произошла ошибка!!!', mtError, [mbOK], 0);
end;
end; 