Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Создание DOM HTML в Delphi

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

keon



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору


Помогите примером создания DOM HTML в Delphi стоковыми методами, использую RadStudio 10.4/11.3 версий. Делал пробы парсинга на JavaScript и хотелось бы чтобы получилось подобное и на Delphi:

Код:
 
const response = await fetch( url, { method: 'GET', headers: { 'Accept': '*/*' } });
  if (response.ok && response.status===200) {
    text = response.text();
  }  
  ...
  const html = JSON.parse(text).contents;
  const doc = new DOMParser().parseFromString(html, 'text/html');
  const wrapper = doc.getElementById('wrapper');
  if (wrapper) {
    const state = JSON.parse( wrapper.getElementsByTagName('state').item(0).innerHTML );
    ...
  }
 

где цель: получить объект DOM, по которому я дальше простыми методами смогу делать обход и получать/изменять его ноды.
 
Ознакомившись с примерами по запросам я так и не понял как это сделать, самый близкий по достижению цели был пример с DOM XML, но у меня другой тип документа. Я настроил SSL HTTP запрос к странице, подобрал версию протокола, получаю строковое представление HTML страницы:

Код:
 
function TRequest.GetWebPage(const url: string): string;
var
  HTTP: TIdHTTP;
begin
  try
    HTTP := TIdHTTP.Create;
    HTTP.IOHandler := idSSL;
    HTTP.HandleRedirects := True;
    HTTP.Request.Accept := 'text/html';
    HTTP.Request.CacheControl := 'no-cache';
    HTTP.Request.ContentType := 'text/html';
    HTTP.Request.UserAgent := GetUserAgent();
    Result := HTTP.Get(url).Trim;
  finally
    HTTP.Free;
  end;
end;
 

но создать из нее документ (DOM) не получается стоковым методом.
 
P.S. в крайнем случае приму ссылку на DLL стороннего парсера для включения в свой проект.
 


Всего записей: 164 | Зарегистр. 21-12-2006 | Отправлено: 14:09 01-11-2023 | Исправлено: keon, 16:14 01-11-2023
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
keon
https://github.com/JackTrapper/delphi-html-parser

Всего записей: 15121 | Зарегистр. 20-09-2014 | Отправлено: 08:21 03-11-2023
keon



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii

Цитата:
https://github.com/JackTrapper/delphi-html-parser

 
неработающая библиотека
 
1) сначала была ошибка в модуле HtmlReader:
  #$100..#$2FF, #$370..#$37D, #$37F..#$FFF: Result := True;
  [dcc32 Error] HtmlReader.pas: E2030 Duplicate case label
 
пришлось закомментировать лишние диапазоны char'ов, не знаю на сколько это повлияло на общую работоспособность, просто зачем они в таком количестве совсем не понятно, на определенных позициях символов кодировки идут сплошные дубликаты
 
2) самый простой пример просто не рабочий:
 
uses
  DomCore, HtmlParser;
  ...
procedure TCamRequest.FormShow(Sender: TObject);
var
  page: string;
  doc: TDocument;  
begin
  page := '<!DOCTYPE html><html><head><title>Wikipedia</title></head><body>Hello, world!</body></html>';
  doc := THtmlParser.Parse(page);
end;
Project raised exception class ENotImplemented with message 'DoBeforeHeadInsertionMode'
 
П.С. ищем решение дальше

Всего записей: 164 | Зарегистр. 21-12-2006 | Отправлено: 23:20 03-11-2023 | Исправлено: keon, 23:24 03-11-2023
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
keon

Цитата:
просто зачем они в таком количестве совсем не понятно

все там понятно, связано с различными видами (байтностью) уникода.
 
можно попробовать еще
https://github.com/z505/fast-html-parser
https://en.delphipraxis.net/topic/6708-html-parser-alternative-to-mshtml/

Всего записей: 15121 | Зарегистр. 20-09-2014 | Отправлено: 05:24 04-11-2023
keon



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
можно попробовать еще
https://github.com/z505/fast-html-parser
https://en.delphipraxis.net/topic/6708-html-parser-alternative-to-mshtml/

 
https://github.com/ying32/htmlparser - оказалась не рабочей
fast-html-parser - оказалась рабочей, но не такой уж и FAST
 
пока в приоритете эта либа - https://github.com/ange007/HTMLp, она быстрее парсит и функционала вроде как больше
 
П.С. у fast-html-parser есть неплохая фишка, это можно сразу к нужному тегу обратиться по индексу массива, но любой чих в странице и вы теряете условный XPath к своему тэгу и еще не совсем понятно на сколько прирост быстродействия адресации по массиву + время парсинга в DOM выиграет у другой либы, где и парсинг на порядок быстрее + обращение к цели возможен по классу или имени тега и пр...
 
П.С.С. просто пребываю в шоке от момента, когда перешел от комфорта парсинга в JavaScript в болото реализаций парсинга в Delphi, кароче полное разочарование, время того не стоит, видимо пришло время переходить на С/С++ есть надежда что там дела обстоят куда лучше

Всего записей: 164 | Зарегистр. 21-12-2006 | Отправлено: 15:45 04-11-2023 | Исправлено: keon, 15:50 04-11-2023
keon



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору


Может кто подсказать с изменением свойства компонента, нашел код цветной кнопки, но не могу изменить цвет шрифта.

Код:
 
procedure TColorButton.DrawButton(Rect: TRect; State: UINT);
var
  Flags, OldMode: Longint;
  IsDown, IsDefault, IsDisabled: Boolean;
    OldColor: TColor;
    OrgRect: TRect;
begin
  OrgRect := Rect;
  Flags := DFCS_BUTTONPUSH or DFCS_ADJUSTRECT;
  IsDown := State and ODS_SELECTED <> 0;
  IsDefault := State and ODS_FOCUS <> 0;
  IsDisabled := State and ODS_DISABLED <> 0;
 
  if IsDown then Flags := Flags or DFCS_PUSHED;
  if IsDisabled then Flags := Flags or DFCS_INACTIVE;
 
  if IsFocused or IsDefault then
  begin
    FCanvas.Pen.Color := clWindowFrame;
    FCanvas.Pen.Width := 1;
    FCanvas.Brush.Style := bsClear;
    FCanvas.Rectangle(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom);
    InflateRect(Rect, - 1, - 1);
  end;
 
  if IsDown then
        begin
            FCanvas.Pen.Color := clBtnShadow;
            FCanvas.Pen.Width := 1;
            FCanvas.Brush.Color := clBtnFace;
            FCanvas.Rectangle(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom);
            InflateRect(Rect, - 1, - 1);
        end
  else
    DrawFrameControl(FCanvas.Handle, Rect, DFC_BUTTON, Flags);
 
  if IsDown then OffsetRect(Rect, 1, 1);
 
    OldColor := FCanvas.Brush.Color;
    FCanvas.Brush.Color := Color;
    FCanvas.FillRect(Rect);
    FCanvas.Brush.Color := OldColor;
    OldMode := SetBkMode(FCanvas.Handle, TRANSPARENT);
    FCanvas.Font.Color := clBtnText;
 
    if IsDisabled then
    DrawState(FCanvas.Handle, FCanvas.Brush.Handle, nil, Integer(Caption), 0,
    ((Rect.Right - Rect.Left) - FCanvas.TextWidth(Caption)) div 2,
    ((Rect.Bottom - Rect.Top) - FCanvas.TextHeight(Caption)) div 2,
            0, 0, DST_TEXT or DSS_DISABLED)
    else
        DrawText(FCanvas.Handle, PChar(Caption), - 1, Rect,
            DT_SINGLELINE or DT_CENTER or DT_VCENTER);
    SetBkMode(FCanvas.Handle, OldMode);
 
  if Assigned(FOnDrawButton) then
    FOnDrawButton(Self, Rect, TOwnerDrawState(LongRec(State).Lo));
 
  if IsFocused and IsDefault then
  begin
    Rect := OrgRect;
    InflateRect(Rect, - 4, - 4);
    FCanvas.Pen.Color := clWindowFrame;
    FCanvas.Brush.Color := clBtnFace;
        DrawFocusRect(FCanvas.Handle, Rect);
  end;
end;
 

 
P.S. нашел свой косяк, в коде были модификации свойств кнопки. а я в gui-редакторе изменяю и не понимаю почему не меняется
 


Всего записей: 164 | Зарегистр. 21-12-2006 | Отправлено: 23:20 04-11-2023 | Исправлено: keon, 23:28 04-11-2023
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Создание DOM HTML в Delphi


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru