Парсинг данных. Собираем ссылки со страницы

4 минуты на чтение

Довольно много есть задач, при которых нужно собрать все внутренние например ссылки со страницы, или вообще все. Так вот в данной статье мы об этом и поговорим, уже много прошли статей по парсингу и смысл здесь не поменяется, все теже компоненты, все таже наша функция парсинга страниц, здесь нам необходимо только лишь добавить то, чтобы у нас собирались все ссылки, а не первая попавшееся. Для этого я решил использовать метки, самому даже смешно, метки ;))). Ну это дело поправимо, мы можем и цикл использовать, тут как говорится на вкус и цвет товарищей нет. Конечно с регулярными выражениями тут все просто, но я до них пока что не дошел. Так что пробуем и делаем пока, что как умеем.

Повторюсь насчет компонентов, которые нам необходимы

  • TIdHTTP
  • TIdAntiFreeze
  • TButton1
  • TProgressBar

Вроде бы все компоненты перечислил. Итак приступим к нашей работе.

Как всегда получаем текст нашей html-страницы, для дальнейшего парсинга

var
html:WideString;
begin
html:=IdHTTP1.Get('https://devdelphi.ru');
end;

Часто в теги <a href> пишется разные параметры, типа class, id, title и так далее, естественно это все нам ненадо в наших ссылках и поэтому необходимо создать массив этих самих параметров, чтобы от них же затем и избавиться, я выбрал переменную типа TStringList, туда и буду записывать в нее те самые параметры

var
tagHtml:TStringList;
begin
tagHtml:=TStringList.Create;
tagHtml.Clear;
tagHtml.Add('class');
tagHtml.Add('id="');
tagHtml.Add('target');
tagHtml.Add('title');
end;

Готово, отлично продолжим, теперь я хочу сказать, что с точки зрения валидатора ссылки тега <a href> заключаются в «двойные кавычки«, но есть сайты, которые и в одинарные заключают, поэтому тут не угадаешь и мы будем выводить ссылки, что находятся в кавычках. Затем это дело можно усовершенствовать и поудалять лишнее. В конечном итоге вот что у меня получилось

procedure TForm1.Button1Click(Sender: TObject);
label met;
var
html,output:WideString;
i:integer;
tagHtml:TStringList;
begin
try
output:='';
tagHtml:=TStringList.Create;
tagHtml.Clear;
tagHtml.Add('class');
tagHtml.Add('id="');
tagHtml.Add('target');
tagHtml.Add('title');
IdHTTP1.Request.AcceptCharSet:='utf-8';
html:=IdHTTP1.Get('https://devdelphi.ru');
met:
begin
if pos('<a href=',html)<>0 then
begin
inc(count);
ProgressBar1.Max:=count;
output:='';
Delete(html,1,pos('<a href=',html)+length('<a href=')-1);
output:=copy(html,1,pos('>',html)-1);
if pos('http',output)<>0 then
begin
for i:=0 to tagHtml.Count-1 do
begin
if pos(tagHtml.Strings[i],output)<>0 then
Delete(output,pos(tagHtml.Strings[i],output),length(output));
end;
ListBox1.Items.Add(output);
ProgressBar1.Position:=ProgressBar1.Position+1;
end;
goto met
end
else
exit;
end;
tagHtml.Free;
except
on e:Exception do
tagHtml.Free;
end;
end;

Как видите есть дополнительный цикл, который чистит наш тег, от ненужных параметров. В общем можно смело писать программу по сбору ссылок и постепенно усовершенствовать ее. Исходники стать скачать можно тут

Facebook Vk Ok LinkedIn Telegram

Похожие записи:

Продолжаем работу с базами данных. На этот раз, хотел бы рассмотреть фильтрацию данных в БД. Вообще, хотелось бы поговорить, для чего она предназначена, а также способы фильтрации данных, другими словами поиска данных в БД, с использованием технологии ADO. Как...
В части мы рассмотрели как можно пропарсить данные, не используя регулярные выражения. Мы даже написали свою функцию парсинга данных, которую можно будет использовать в данной статье, но я обойдусь без нее, а Вы сможете ею воспользоваться, если конечно захотит...
Здравствуйте, в этой стать, я хотел бы рассказать, как я в своих проектах делаю поддержку обновлений программы (выдача ссылки на новую версию программы). Кроме обновления программы (выдача ссылки на скачку новой версии программы), я расскажу, как именно сделат...