Довольно много есть задач, при которых нужно собрать все внутренние например ссылки со страницы, или вообще все. Так вот в данной статье мы об этом и поговорим, уже много прошли статей по парсингу и смысл здесь не поменяется, все теже компоненты, все таже наша функция парсинга страниц, здесь нам необходимо только лишь добавить то, чтобы у нас собирались все ссылки, а не первая попавшееся. Для этого я решил использовать метки, самому даже смешно, метки ;))). Ну это дело поправимо, мы можем и цикл использовать, тут как говорится на вкус и цвет товарищей нет. Конечно с регулярными выражениями тут все просто, но я до них пока что не дошел. Так что пробуем и делаем пока, что как умеем.
Повторюсь насчет компонентов, которые нам необходимы
- TIdHTTP
- TIdAntiFreeze
- TButton1
- TProgressBar
Вроде бы все компоненты перечислил. Итак приступим к нашей работе.
Как всегда получаем текст нашей html-страницы, для дальнейшего парсинга
var
html:WideString;
begin
html:=IdHTTP1.Get('https://zaokomtek.ru');
end;
Часто в теги пишется разные параметры, типа 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;
Готово, отлично продолжим, теперь я хочу сказать, что с точки зрения валидатора ссылки тега заключаются в «двойные кавычки«, но есть сайты, которые и в одинарные заключают, поэтому тут не угадаешь и мы будем выводить ссылки, что находятся в кавычках. Затем это дело можно усовершенствовать и поудалять лишнее. В конечном итоге вот что у меня получилось
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://zaokomtek.ru');
met:
begin
if pos(';
Delete(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;
Как видите есть дополнительный цикл, который чистит наш тег, от ненужных параметров. В общем можно смело писать программу по сбору ссылок и постепенно усовершенствовать ее.
Хочу заметить, что в настоящее время очень популярно иметь для своего автомобиля прицеп. Так как, имея прицеп, Вы сможете перевозить довольные больше грузы. Существуют отличные фаркопы для ленд ровер, которые отличаются хорошим качеством, надежностью, а самое главное низкой ценой. Установив, на свой автомобиль фаркоп, для Вас это будет только плюсом. |
Исходники стать скачать можно тут
Автор статьи - Andrey53
Похожие записи
Метки: idAntifreeze, Idhttp, парсинг, парсинг html-страниц, парсинг данных, получение ссылок с сайта
Мне показалось, или я увидел там goto?
Вы только код посмотрели? в статье я писал
Для этого я решил использовать метки, самому даже смешно, метки ))
IdHTTP1.Request.AcceptCharSet что это???))
установка кодировки страницы
Thx 2 afftar )))
Как спарсить все ссылки со страницы и вывести их в текст бокс?
здесь все написано как, в какой текст бокс? Edit.Text?
To Алексей:
ListBox.item.add(output);
Из-за того, что цикл у вас реализован через goto и выход из цикла происходит по exit, команда не выполняется, и происходит «утечка памяти».
Правильней было-б все-таки реализовать цикл через repeat until, и выходить из него по break…
tagHtml.Free; — не выполняется
так можно реализовать через обычный цикл!