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

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

  • TIdHTTP
  • TIdAntiFreeze
  • TButton1
  • TProgressBar

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

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

var
html:WideString;
begin
html:=IdHTTP1.Get('http://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('http://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;

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

Хочу заметить, что в настоящее время очень популярно иметь для своего автомобиля прицеп. Так как, имея прицеп, Вы сможете перевозить довольные больше грузы. Существуют отличные фаркопы для ленд ровер, которые отличаются хорошим качеством, надежностью, а самое главное низкой ценой. Установив, на свой автомобиль фаркоп, для Вас это будет только плюсом.

Исходники стать скачать можно тут

Автор статьи - Andrey53

Метки: , , , , ,




К записи “Парсинг данных. Собираем ссылки со страницы” оставлено комментариев: 11.

  1. Мне показалось, или я увидел там goto? :)

    • Andrey53:

      Вы только код посмотрели? в статье я писал
      Для этого я решил использовать метки, самому даже смешно, метки ))

  2. Міша:

    IdHTTP1.Request.AcceptCharSet что это???))

  3. Міша:

    Thx 2 afftar )))

  4. Как спарсить все ссылки со страницы и вывести их в текст бокс?

  5. QwertyZ:

    To Алексей:
    ListBox.item.add(output);

  6. AlnZ:

    Из-за того, что цикл у вас реализован через goto и выход из цикла происходит по exit, команда не выполняется, и происходит «утечка памяти».
    Правильней было-б все-таки реализовать цикл через repeat until, и выходить из него по break…

  7. AlnZ:

    tagHtml.Free; — не выполняется

Оставить комментарий

Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

*