Парсинг сайта Delphi

Парсинг сайта в Delphi с помощью IdHTTP и Pos

Перед нами стоит задача получить содержимое HTML кода сайта. Например, нужно вытащить текст, который находится в title.

Для решения поставленной задачи, мы будем использовать компоненты IdHTTP, IdSSLIOHandlerSocketOpenSSL, процедуру delete, функции pos и length.

Также, если мы будем работать с сайтом, который передает данные по защищённому протоколу (HTTPS, использует SSL сертификат), нужно скачать и добавить в папку с проектом два dll файла – ssleay32.dll и libeay32.dll (для разных версий Windows требуются разные версии этих библиотек. Я даю вам ссылку на те файлы, которые отлично работают у меня на Windows 10).

Получение HTML кода страницы сайта и его парсинг

Для решения поставленной задачи, нужно создать форму и поместите на неё следующие компоненты:

  1. Edit1
  2. Button1
  3. Memo1
  4. Memo2
  5. IdHTTP1
  6. 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;

Delphi Функции

Функция Abs – предназначена для получения абсолютной величины числа (модуль)

Функция Addr – возвращает адрес переменной, функции или процедуры

Функция AnsiCompareStr – сравнение двух строк на равенство

Функция AnsiCompareText – сравнение двух строк на равенство

Функция AnsiContainsStr – возвращается истина, если строка содержит подстроку

Функция AnsiEndsStr – возвращается истина, если строка заканчивается подстрокой

Функция AnsiIndexStr – сравнивает строку со списком строк, возвращает соответствующий индекс

Функция AnsiLeftStr – извлекает символы с левой стороны строки

Функция AnsiLowerCase – символы верхнего регистра изменяются в строку со строчными буквами

Функция AnsiMatchStr – возвращается истина, если строка точно соответствует какой-либо строке из списка

Функция AnsiMidStr – возвращает подстроку из средних символов строки

Функция AnsiPos – находит позицию одной строки в другой

Функция AnsiReplaceStr – заменяет часть одной строки другой

Функция AnsiReverseString – переворачивает последовательность символов в строке

Функция AnsiRightStr – извлечение символов с правой стороны строки

Функция AnsiStartsStr – возвращает True, если строка начинается с подстроки

Функция AnsiUpperCase – символы нижнего регистра изменяются на символы верхнего регистра

Функция ArcCos – арккосинус числа, возвращается в радианах

Функция ArcSin – арксинус числа, возвращается в радианах

Функция ArcTan – арктангенс числа, возвращается в радианах

Функция Assigned – осуществляет проверку функциональности указателей, объектов, методов

Функция BeginThread – начинает отдельный поток выполнения кода

Функция Bounds – передаёт координаты вершин объекта типа TRect (прямоугольник)

Функция CelsiusToFahrenheit – конвертирует значение температуры из Цельсия в Фаренгейта

Функция ChangeFileExt – изменяет расширение имени файла

Функция Chr – конвертирует целое число в символ

Функция Concat – cоединяет несколько строк в одну

Функция Convert – преобразует одну величину измерения в другую

Функция Copy – создает копию части строки или части массива

Функция Cos – косинус числа

Функция CreateDir – создаёт директорию

Функция CurrToStr – преобразует денежную величину в строку

Функция CurrToStrF – преобразует денежную величину в строку с форматированием

Функция Date – возвращает текущую дату

Функция DateTimeToFileDate – преобразует значение TDateTime в формат date/time формат файла

Функция DateTimeToStr – конвертирует значение даты и времени TDateTime в строку

Функция DateToStr – преобразует значение даты TDateTime в строку

Функция DayOfTheMonth – дает день месяца для значения TDateTime (ISO 8601)

Функция DayOfTheWeek – возвращает индекс дня недели для значения TDateTime (ISO 8601)

Функция DayOfTheYear – выдает день года для значения TDateTime (ISO 8601)

Функция DayOfWeek – выдает индекс дня недели для значения TDateTime

Функция DaysBetween – выдает целое число дней между 2 датами

Функция DaysInAMonth – выдает число дней в месяце

Функция DaysInAYear – выдает число дней в году

Функция DaySpan – выдает дробное число дней между 2 датами

Функция DegToRad – преобразовывает значения градусов в радианы

Функция DeleteFile – удаляет файл, указанный в параметре

Функция DirectoryExists – возвращает True, если указанная директория существует

Функция DiskFree – выдает число свободных байтов на указанном диске

Функция DiskSize – выдает размер указанного диска в байтах

Функция DupeString – создает строку, содержащую копии подстроки

Функция EncodeDate – формирует значение TDateTime из значений года, месяца и дня

Функция EncodeDateTime – формирует значение TDateTime из значений времени и дня

Функция EncodeTime – формирует значение TDateTime из значений часа, минуты, секунды и миллисекунды

Функция EndOfADay – генерирует значение TDateTime, установленное на самый конец дня

Функция EndOfAMonth – генерация значения TDateTime, установленное на самый конец месяца

Функция Eof – возвращает True, если позиция курсора находится в конце файла открытого с помощью Reset

Функция Eoln – возвращает True, если позиция курсора находится в конце строки

Функция Exp – выдаёт экспоненту числа

Функция ExtractFileDir – извлекает из полного имени файла название папки

Функция ExtractFileDrive – извлекает из полного имени файла название диска

Функция ExtractFileExt – извлекает из полного имени файла его расширение

Функция ExtractFileName – извлекает из полного имени файла краткое имя файла

Функция ExtractFilePath – извлекает из полного имени файла название патча

Функция FahrenheitToCelsius – конвертирует температуру из Фаренгейта в Цельсий

Функция FileAge – получение даты/время последнего изменения файла, не открывая его

Функция FileDateToDateTime – конвертирует формат даты/времени файла в значение TDateTime

Функция FileExists – возвращает True если указанный файл существует

Функция FileGetAttr – выдаёт атрибуты файла

Функция FilePos – даёт позицию файла в двоичном или текстовом файле

Функция FileSearch – поиск файла в одной или более папках

Функция FileSetAttr – устанавливает атрибуты файла

Функция FileSetDate – установка даты и времени последнего изменения файла

Функция FileSize – выдает размер открытого файла в записях

Функция FindClose – закрывает успешный FindFirst поиск файла

Функция FindCmdLineSwitch – определяет, был передан некоторый параметр выключатель

Функция FindFirst – находит все файлы, соответствующие маске файла и атрибутов

Функция FindNext – находит следующий файл после успешного FindFirst

Функция FloatToStrF – преобразует значение с плавающей запятой в строку с форматированием

Функция ForceDirectories – создаёт новый путь каталогов

Функция Format – расширенное форматирование чисел и текста в строке

Функция FormatCurr – расширенное форматирование значений валюты в строку

Функция FormatDateTime – расширенное форматирование переменной TDateTime в строку

Функция FormatFloat – расширенное форматирование числа с плавающей запятой в строку

Функция Frac – дробная часть числа с плавающей запятой

Функция GetCurrentDir – возвращает текущий каталог (диск плюс каталог)

Функция GetLastError – выдаёт код ошибки последнего неудачного Windows API вызова

Функция GetMem – получает указанное число байтов памяти

Функция Hi – возвращает байт старшего разряда от типа Integer

Функция High – возвращает самое высокое значение типа или переменной

Функция IncDay – приращивает переменную типа TDateTime на + или - число дней

Функция IncMillisecond – приращивает переменную типа TDateTime на + или - число миллисекунд

Функция IncMinute – приращивает переменную типа TDateTime на + или - число минут

Функция IncMonth – увеличивает TDateTime переменную на некоторое число месяцев

Функция IncSecond – приращивает переменную типа TDateTime на + или - число секунд

Функция IncYear – увеличивает TDateTime переменную на количество лет

Функция InputBox – отображает диалог, который просит пользователя о вводе текста, со значением по умолчанию

Функция InputQuery – отображает диалог, который просит пользователя о вводе текста

Функция Int – целая часть числа с плавающей точкой

Функция IntToHex – преобразует целое число в шестнадцатеричную строку

Функция IntToStr – конвертирует целое число в строку

Функция IOResult – содержит возвращаемый код последней операции ввода/вывода

Функция IsInfinite – проверяет, является ли число с плавающей точкой бесконечным

Функция IsLeapYear – возвращает True, если данный календарный год високосный

Функция IsMultiThread – возвращает True, если код выполняет множество потоков

Функция IsNaN – выясняет, содержит ли число с плавающей запятой настоящее число

Функция LastDelimiter – находит последнюю позицию указанных символов в строке

Функция Length – возвращает число элементов в массиве или строке

Функция Ln – выдает натуральный логарифм числа

Функция Lo – возвращает младший байт целого числа (2-байтового)

Функция Log10 – вычисляет логарифм числа с основанием 10

Функция Low – возвращает самое низкое значение типа или переменной

Функция Max – выдает максимальное число из двух целых значений

Функция Mean – выдает среднее число из набора чисел

Функция MessageDlg – отображает сообщение, знак и выбираемые кнопки

Функция MessageDlgPos – отображает сообщение и кнопки в заданной позиции экрана

Функция Min – выдает минимальное из двух целых значений

Функция MonthOfTheYear – выдает месяц года для значения TDateTime

Функция Now – выдает текущую дату и время

Функция Odd – проверяет, является ли целое число нечетным

Функция Ord – порядковое значение целого числа, символа или перечисления

Функция ParamCount – выдает число параметров переданной текущей программе

Функция ParamStr – возвращает один из параметров, используемых для запуска текущей программы

Функция Pi – математическая константа

Функция Point – генерирует значение TPoint из значений X и Y

Функция PointsEqual – сравнивает два значения TPoint на предмет равенства

Функция Pred – уменьшает порядковую переменную

Функция Printer – возвращает ссылку на глобальный объект Printer

Функция PromptForFileName – показывает диалог, позволяющий пользователю выбрать файл

Функция PtInRect – проверяет, находится ли точка в пределах прямоугольника

Функция RadToDeg – преобразовывает значение радиана в градусы

Функция Random – генерирует случайное число с плавающей запятой или целое число

Функция RandomRange – генерирует произвольное число в пределах введённого диапазона

Функция RecodeDate – изменяет только дату переменной TDateTime

Функция RecodeTime – изменяет только время переменной TDateTime

Функция Rect – создаёт объект TRect (прямоугольник) с указанием 2 точек или 4 координат

Функция RemoveDir – удалить директорию

Функция RenameFile – переименование файла или директории

Функция Round – округление чисел с плавающей запятой до целого числа

Функция SeekEof – пропускает символы, пока не встретится конец файла

Функция SeekEoln – пропускает символы, пока не встретится конец текущей строки или файла

Функция SelectDirectory – выводит диалоговое окно, с помощью которого пользователь может выбрать директорию

Функция SetCurrentDir – изменяет текущую директорию

Функция ShellExecute – открывает или выводит на печать указанный файл

Функция Sin – возвращает синус числа

Функция SizeOf – возвращает занимаемый размер типа или переменной в байтах

Функция Slice – создает часть массива с параметром "Открытый Массив"

Функция Sqr – возвращает квадрат числа

Функция Sqrt – возвращает квадратный корень числа

Функция StringOfChar – создает строку из одного символа, повторенного много раз

Функция StringReplace – заменяет одну или несколько подстрок, найденных в заданной строке

Функция StringToWideChar – преобразует обычную строку в WideChar-буфер с завершающим 0

Функция StrScan – ищет заданные символы в строке

Функция StrToCurr – преобразует числовую строку в денежное выражение

Функция StrToDate – конвертирует строку с датой в значение типа TDateTime

Функция StrToDateTime – конвертирует строку с датой и временем в значение типа TDateTime

Функция StrToFloat – преобразует числовую строку в значение с плавающей запятой

Функция StrToInt – преобразует строку с целым значением в Integer

Функция StrToInt64 – преобразует строку с целым значением в Int64

Функция StrToInt64Def – преобразует строку с целым значением в Int64, учитывая значение по умолчанию

Функция StrToIntDef – преобразует строку в значение с типом Integer, учитывая значение по умолчанию

Функция StrToTime – конвертирует строку с временем в значение с типом TDateTime

Функция StuffString – заменяет часть одной строки на другую

Функция Succ – инкрементирует порядковую переменную

Функция Sum – находит сумму элементов массива, состоящего из чисел с плавающей точкой

Функция Tan – тангенс числа

Функция Time – возвращает текущее время

Функция TimeToStr – конвертирует значение времени типа TDateTime в строку

Функция Tomorrow – возвращает дату завтрашнего дня

Функция Trim – удаляет начальные и конечные пробелы в строке

Функция TrimLeft – удаляет начальные пробелы в строке

Функция TrimRight – удаляет конечные пробелы в строке

Функция Trunc – целая часть числа с плавающей запятой

Функция VarType – возвращает текущий тип Variant переменной

Функция WideCharToString – копирует строку WideChar, заканчивающуюся нулём, в нормальную строку

Функция WrapText – добавляет перенос строки в строку, чтобы имитировать перенос слов

Функция Yesterday – возвращает вчерашнюю дату в местном часовом поясе

Delphi Процедуры

Процедура Abort – прерывает обработку команд и выходит к последнему исключительному блоку

Процедура Append – открывает текстовый файл, для добавления записей в файл (добавляет в конец файла)

Процедура AssignFile – связывает дескриптор файла с бинарным или текстовым файлом

Процедура AssignPrn – обрабатывает принтер как текстовый файл (простой способ печати текста)

Процедура Beep – делает звук гудка

Процедура BlockRead – читает блок записей данных из нетипизированного двоичного файла

Процедура BlockWrite – записывает блок записей данных в нетипизированный двоичный файл

Процедура Break – выполняет выход из одного цикла

Процедура ChDir – выбор диска и директории (папки), в которой будет производиться работа

Процедура CloseFile – закрывает открытый файл

Процедура Continue – заставляет перейти к следующей итерации цикла

Процедура DateTimeToString – огромные возможности форматирования даты в строку

Процедура Dec – декремент порядковой переменной

Процедура DecodeDate – извлекает значения года, месяца, дня из TDateTime переменной

Процедура DecodeDateTime – разбивает TDateTime переменную на ее части даты/времени

Процедура DecodeTime – разбивает значение TDateTime на отдельные значения времени

Процедура Delete – удаляет часть символов из строки

Процедура Dispose – очищает память на которую указывает указатель

Процедура EndThread – заканчивает поток с кодом завершения

Процедура Erase – стирает файл

Процедура Exclude – исключает значение из переменной набора (множества)

Процедура Exit – осуществляет выход из функции или процедуры

Процедура FillChar – заполняет раздел памяти значением байта или символа-заполнителя

Процедура Flush – сбрасывает буферизованные данные текстового файла в файл

Процедура FreeAndNil – освобождение памяти объекта и установка его в nil

Процедура FreeMem – освобождает память, используемую переменной

Процедура GetDir – получает текущий каталог (диск плюс путь) для указанного диска

Процедура GetLocaleFormatSettings – получает региональные значения для безопасных потоков функций

Процедура Halt – заканчивает программу с дополнительным диалогом

Процедура Inc – увеличивает порядковую переменную

Процедура Include – включает значение во множество переменных

Процедура Insert – вставляет строку в другую строку

Процедура MkDir – создаёт каталог

Процедура Move – копирует байты данных из источника в место назначения

Процедура New – создаёт новую переменную типа указатель

Процедура ProcessPath – разделяет строку диск/путь/имя файла на ее составляющие части

Процедура Randomize – устанавливает генератор случайного числа на следующее значение

Процедура Read – позволяет прочитать данные из двоичного или текстового файла

Процедура ReadLn – позволяет прочитать полную строку данных из текстового файла

Процедура Rename – переименование файла

Процедура ReallocMem – позволяет изменить размер существующего блока памяти

Процедура ReplaceDate – изменяет только часть даты TDateTime переменной

Процедура ReplaceTime – изменяет только часть времени TDateTime переменной

Процедура Reset – открывает текстовый файл для чтения, или двоичный файл для чтения/записи

Процедура ReWrite – открывает текстовый или двоичный файл для записи

Процедура RmDir – удаление каталога

Процедура RunError – заканчивает программу с диалогом ошибки

Процедура Seek – перемещает указатель в двоичном файле в новую позицию

Процедура SetLength – изменяет размер строки или размер динамического массива

Процедура SetString – копирует символы из буфера в строку

Процедура ShowMessage – показывает простое диалоговое окно с кнопкой ОК, содержащее заданную строку

Процедура ShowMessageFmt – отображает отформатированные данные в простом диалоговом окне с кнопкой ОК

Процедура ShowMessagePos – показывает строку в простом диалоговом окне размещенном в заданном месте

Процедура Str – конвертирует целое число или число с плавающей точкой в строку

Процедура Truncate – уменьшает размер файла, удаляя все данные после текущей позиции

Процедура Val – конвертирует числовые строки в целое число, или число с плавающей запятой

Процедура Write – записывает данные в бинарный или текстовый файл

Процедура WriteLn – записывает законченную строку данных в текстовый файл

Main Menu