Печать
Просмотров: 5587

Рейтинг:  5 / 5

Звезда активнаЗвезда активнаЗвезда активнаЗвезда активнаЗвезда активна
 

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


Для этого нам понадобится.
Кормушки.

КормушкиФорма.

form1Поле редактирования данных
Кнопка
ListView

Мне кормушка ни к чему, вам на своё усмотрение.
И так , открывает Lazarus.
Создаем пустой проект.
Подключаем в uses следующие модули.

 

fphttpclient, LConvEncoding, sax_html, dom_html, dom

 

Затем начинаем писать код.
Парсить будет сайт статистики, поскольку чаще всего парсят какие либо списки из интернета. Метод в общем то будет универсальным, достаточно понять где лежит требуемая информация. Для примера возьмем сайт со статистиков по командам, играющим в CS:GO. Возьмем таблицу команд.
Если заглянуть в html код, то там все будет выглядеть так.

navi html 

Нам потребуется получить данные о командах. Для этого возьмем компоненты для парсинга данных, входящих в Lazarus по умолчанию. Это файлы sax_html, dom_html, dom

Будем парсить данные основываясь на DOM модели веб страницы.

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

 

procedure TForm1.btnStartClick(Sender: TObject);
var
  httpclient: TFPHTTPClient;
  html: string;
  doc: thtmldocument;
  nlist: tdomnodelist;
  i: integer;
  j: integer;
  s: string;
begin
  httpclient := TFPHttpClient.Create(nil);
  httpclient.AddHeader('User-Agent',
    'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0');
  try
    html := httpclient.Get(edUrl.Text);
  finally
    httpclient.Free;
  end;
 // если не юникод
 //  readhtmlfile(doc, tstringstream.Create(CP1251ToUTF8(html)));

  readhtmlfile(doc, tstringstream.Create(html));
  nlist := doc.GetElementsByTagName('div');
  ListView1.Items.BeginUpdate;
  for i := 0 to nlist.Count - 1 do
  begin
    if (tdomelement(nlist[i]).getattribute('class') = 'ranked-team standard-box') then
    begin
      with ListView1.Items.Add do
      begin
        Caption := nlist[i].ChildNodes[1].ChildNodes[1].ChildNodes[0].TextContent;
        SubItems.Add(nlist[i].ChildNodes[1].ChildNodes[1].ChildNodes[3].ChildNodes[1].ChildNodes[0].TextContent);
        SubItems.Add(nlist[i].ChildNodes[1].ChildNodes[1].ChildNodes[3].ChildNodes[1].ChildNodes[1].TextContent);
        SubItems.Add(ClearLine(nlist[i].ChildNodes[1].ChildNodes[1].ChildNodes[3].ChildNodes[3].TextContent));
        SubItems.Add(nlist[i].ChildNodes[1].ChildNodes[1].ChildNodes[7].ChildNodes[0].TextContent);
      end;
    end;

  end;
  ListView1.Items.EndUpdate;
  nlist.Free;
  doc.Free;
end;         

 

Как видите ничего сложного.

lazarus parser

Исходный код проекта так же прикрепляю.

 

Вложения:
Скачать этот файл (simple_parser.zip)simple_parser.zip[ ]133 Кб