Отправляет email-рассылки с помощью сервиса Sendsay

Delphi для профессионалов

  Все выпуски  

Delphi для профессионалов Извлечение ссылок из HTML-файла при помощи DOM


Всем привет!
Повторимся со вводной информацией. С последующего выпуска в этом блоке будут размещаться важные объявления.

Рассылка формируется на основе форума Iguana Delphi Forum (http://forum.igp.org.ua/).
Вопросы затрагиваемые в рассылке будут интересные и разнообразные, но простых не будет. Это может быть работа с БД, работа с сетевыми ресурсами, создание и модернизация компонент, работа с ActiveX, разбор алгоритмов, публикация статей.

Убедительно прошу перед тем как задавать вопрос подумайте дважды.
Возможны Вы в состоянии решить вопрос без посторонней помощи.


Вы не далеко не всегда получите ответ в виде "готового кода", но по крайней мере Вашим мыслям будет задан некоторый вектор движения к цели.

Все выпуски можно обсудить на форуме (http://forum.igp.org.ua/?num=1175289010), а также предложить тему следующего выпуска (http://forum.igp.org.ua/?num=1175288840).

Вакансии с форума

Поступили следующие вакансии на форум:


Delphi Developer (Kiev) Intelligent Software – многопрофильная, динамично развивающаяся IT компания, занимающаяся как созданием программного обеспечения, так и разработками web систем, в связи с расширением штата открывает вакансии Software Developer.

Требования:
* Твердые знания и опыт работы в Delphi 2000-2006 либо С/С++
* Знание SQL (желателен и опыт работы в RDBMS Firebird)...

За относительно долгое время (с момента рассылки первого выпуска) на форуме не поступило никаких предложений тем для рассылки. Посему тема рассылки снова выбиралась мною.

Извлечение ссылок из HTML-файла при помощи DOM

Сразу необходимо договориться, что мы производим прием страницы из интернета при помощи, например, Indy. Для начала нам необходимо подключить все необходимые модули для работы с ActiveX, DOM-структурой и протоколами TPC/IP и HTTP.

uses
  ActiveX, COMObj, MSHTML, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP;

Опишем тело процедуры:

procedure GetLinks(AURL: String; AURLList, ALinkTextList: TStrings);
// AURL - параметр содержащий адрес интернет, из которого будем извлекать ссылки
// AURList - набор строк (TStrings), в который будут записаны ссылки
// ALinkTextList - набор строк (TStrings), в который будут записаны надписи на ссылках

var
  IDoc : IHTMLDocument2;
  strHTML : String;
  v : Variant;
  vTitle : string;
  i, j, x: integer;
  ovLinks: OleVariant;
  idHTTP1: TidHTTP;
begin

  // создаем объект документа Интернет
  Idoc:=CreateComObject(Class_HTMLDocument) as IHTMLDocument2;
  // создаем объект клиента протокола HTTP
  idHTTP1 := TidHTTP.Create(Self);

  try
    // включаем режим редактирования документа
    IDoc.designMode:='on';
    // пока документ не создан - просто обрабатываем системные события
    while IDoc.readyState<>'complete' do
      Application.ProcessMessages;
    // создаем динамический массив типа Variant
    v:=VarArrayCreate([0,0],VarVariant);
    // считываем страницу из интернета
    strHTML := idHTTP1.Get(AURL);
    // и подкладываем в массив
    v[0]:= strHTML;
    // записываем полученные строки в наш документ
    IDoc.write(PSafeArray(System.TVarData(v).VArray));
    // отключаем режим редактирования документа
    IDoc.designMode:='off';
    // ожидаем завершения создания и разбора документа
    while IDoc.readyState<>'complete' do
      Application.ProcessMessages;
    // получаем массив тегов A, т.е. ссылок
    ovLinks := IDoc.all.tags('A');
    // в том случае, если ссылки в документе есть - начинаем разбор
    if ovLinks.Length > 0 then begin
      for x := 0 to ovLinks.Length-1 do begin
        // в переменную AURList добавляем адрес ссылки (HREF)
        AURLList.Add(ovLinks.Item(x).href);
        // в переменную ALinkTextList добавляем текст содержащийся внутри ссылки (т.е. между открывающим тегом <a> и закрывающим </a>)
        ALinkTextList.Add(ovLinks.Item(x).innerText);
      end;
    end;
  finally
    // освобождаем память HTTP-клинета
    idHTTP1.Free;
    // обнуляем переменную документа Интернет
    IDoc := nil;
  end;
end;

Как вызывать написанную нами процедуру? Согласно описаному прототипу нашей процедуры мы имеем следующий вызов, например, на нажатии кнопки:

procedure TForm1.Button1Click(Sender: TObject);
begin
  GetLinks('http://igp.org.ua/', ListBox2.Items, ListBox1.Items);
end;

В данном случае все ссылки со страницы http://igp.org.ua/ будут разобраны т.о., что ссылки будут содержаться в нашем визуальном компоненте ListBox2, а тексты ссылок в компоненте ListBox1.

Постоянная ссылка на статью: http://igp.org.ua/articles/a175/

На этом на сегодня позвольте распрощаться. Ждите следующего выпуска. С уважением, автор рассылки Игорь.

 

 

Обсудить выпуск можно на форуме (http://forum.igp.org.ua/?num=1175289010).
Предложить тему для следующей рассылки также можно на форуме (http://forum.igp.org.ua/?num=1175288840).


В избранное