Перед нами стоїть завдання одержати вміст 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; 