Давненько не писал в блог.
Поскольку жизнь не стоит на месте, многое меняется. Вот и программирование перестало быть кормушкой, а скорее теперь для развлечения. На данный момент сменились должность и страна обитания. На досуге вот решил написать небольшую статью. как парсить веб страницы на Lazarus.
Для этого нам понадобится.
Кормушки.
Форма.
Поле редактирования данных
Кнопка
ListView
Мне кормушка ни к чему, вам на своё усмотрение.
И так , открывает Lazarus.
Создаем пустой проект.
Подключаем в uses следующие модули.
fphttpclient, LConvEncoding, sax_html, dom_html, dom
Затем начинаем писать код.
Парсить будет сайт статистики, поскольку чаще всего парсят какие либо списки из интернета. Метод в общем то будет универсальным, достаточно понять где лежит требуемая информация. Для примера возьмем сайт со статистиков по командам, играющим в CS:GO. Возьмем таблицу команд.
Если заглянуть в 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;
Как видите ничего сложного.
Исходный код проекта так же прикрепляю.
RSS лента комментариев этой записи