SQLRU.net
Разработка приложений баз данных

Начало » Программирование » Delphi » Ошибка с разбором IHTMLDocument2 (Нужна помощь с разбором IHTMLDocument2)
Ошибка с разбором IHTMLDocument2 [сообщение #2480] Tue, 06 June 2023 07:48 Переход к следующему сообщению
harvest в настоящее время не в онлайне  harvest
Сообщений: 6
Зарегистрирован: June 2023
Junior Member
Добрый день, т.к. sql.ru больше нет, надеюсь на новом сайте получится найти ответ.
Имеется небольшой кусочек кода, который работал до того как сайт обновил протоколы. Заменена компонента IdHTTP на NetHTTPClient, однако в строке
v[0]:=AHTML;
не происходит полной загрузки строки в вариантный массив, хотя раньше все работало. Из-за этого коллекция элементов
DocTR:=Doc.all.tags('TR') as IHTMLElementCollection;
пустая.
Код процедуры:
ACurCodeN:=682;
CDate:=01.01.2022;
RDate:=28.02.2022;
URL:='https://www.cbr.ru/hd_base/seldomc/sc_dynamic/?UniDbQuery.Posted=True&UniDbQuery.From='+DateToStr(CDate)+'&UniDbQuery.To='+DateToStr(RDate)+'&UniDbQuery.ValID='+ACurCodeN;
try
  //FDataModule.IdHTTP1.HandleRedirects:=true;
  //AHTML:=FDataModule.IdHTTP1.Get(URL); //не работает из-за сайта
  AHTML:=FdataModule.NetHTTPClient1.Get(URL).ContentAsString;
  Doc:=coHTMLDocument.Create as IHTMLDocument2;
  v:=VarArrayCreate([0, 0], varVariant);
  v[0]:=AHTML;
  Doc.write(PSafeArray(System.TVarData(v).VArray));
  DocTR:=Doc.all.tags('TR') as IHTMLElementCollection;
  for i:=1 to DocTR.length-1 do
  begin
    TRElement:= DocTR.Item(i,0) as IHtmlElement;
    DocTD:=TRElement.children as IHTMLElementCollection;
    if (DocTD.length>2) then
    begin
      ADate:=StrToDate((DocTD.Item(0, 0) as IHtmlElement).innerText);
      AValue:=StrToCurr((DocTD.Item(2, 0) as IHtmlElement).innerText);
    end
  end
finally
  Doc:=nil;
Re: Ошибка с разбором IHTMLDocument2 [сообщение #2482 является ответом на сообщение #2480] Tue, 06 June 2023 10:55 Переход к предыдущему сообщениюПереход к следующему сообщению
BlackEric в настоящее время не в онлайне  BlackEric
Сообщений: 295
Зарегистрирован: June 2022
Senior Member
Зачем сайт парсить? Кусы можно тянуть через API: Веб-сервис для получения ежедневных данных (курсы валют, учетные цены драг. металлов и другие)
Re: Ошибка с разбором IHTMLDocument2 [сообщение #2483 является ответом на сообщение #2482] Tue, 06 June 2023 11:05 Переход к предыдущему сообщениюПереход к следующему сообщению
harvest в настоящее время не в онлайне  harvest
Сообщений: 6
Зарегистрирован: June 2023
Junior Member
Цитата:
Зачем сайт парсить? Кусы можно тянуть через API: Веб-сервис для получения ежедневных данных (курсы валют, учетные цены драг. металлов и другие)
Если подскажите как вытащить курс Саудовского риала через этот Веб-сервис буду благодарен
Re: Ошибка с разбором IHTMLDocument2 [сообщение #2487 является ответом на сообщение #2483] Tue, 06 June 2023 19:15 Переход к предыдущему сообщениюПереход к следующему сообщению
BlackEric в настоящее время не в онлайне  BlackEric
Сообщений: 295
Зарегистрирован: June 2022
Senior Member
Банк России временно приостановил публикацию справочных данных о курсах иностранных валют к доллару США, официальные курсы которых не устанавливаются Банком России.

Так он и веб-интерфейсе есть по 4 марта 22...

А так вот схема: https://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx?op=GetCur sOnDateXML
И там по приведенной мной ссылке есть рабочий пример.
Re: Ошибка с разбором IHTMLDocument2 [сообщение #2489 является ответом на сообщение #2487] Wed, 07 June 2023 17:12 Переход к предыдущему сообщениюПереход к следующему сообщению
BlackEric в настоящее время не в онлайне  BlackEric
Сообщений: 295
Зарегистрирован: June 2022
Senior Member
А на странице сайта данные подгружаются JavaScriptom. Поэтому придется в свое приложение добавлять какой-то браузерный контрол и вытягивать данные уже из него. Т.е. что так что так полностью переписать.
Re: Ошибка с разбором IHTMLDocument2 [сообщение #2490 является ответом на сообщение #2489] Wed, 07 June 2023 17:42 Переход к предыдущему сообщениюПереход к следующему сообщению
harvest в настоящее время не в онлайне  harvest
Сообщений: 6
Зарегистрирован: June 2023
Junior Member
BlackEric писал(а) Wed, 07 June 2023 17:12
А на странице сайта данные подгружаются JavaScriptom. Поэтому придется в свое приложение добавлять какой-то браузерный контрол и вытягивать данные уже из него. Т.е. что так что так полностью переписать.
Ну почему же? Если добавить одну строчку Application.ProcessMessages; после Doc.write то все работает.
Re: Ошибка с разбором IHTMLDocument2 [сообщение #2491 является ответом на сообщение #2490] Wed, 07 June 2023 18:01 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 800
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
harvest
. Если добавить одну строчку Application.ProcessMessages; после Doc.write то все работает.
это глюк
Re: Ошибка с разбором IHTMLDocument2 [сообщение #2493 является ответом на сообщение #2491] Thu, 08 June 2023 08:02 Переход к предыдущему сообщениюПереход к следующему сообщению
harvest в настоящее время не в онлайне  harvest
Сообщений: 6
Зарегистрирован: June 2023
Junior Member
В общем, я предполагаю, что суть заключается в различном способе выполнения программы в Delphi 11 по сравнению с Delphi XE8.
Так, у меня в одной и той же процедуре есть запись в базу данных, а затем чтение из нее записанной информации. Это работает в Delphi XE8, но не работает в Delphi 11, пишет ошибка, что записей нет.
Re: Ошибка с разбором IHTMLDocument2 [сообщение #2494 является ответом на сообщение #2493] Thu, 08 June 2023 10:06 Переход к предыдущему сообщению
harvest в настоящее время не в онлайне  harvest
Сообщений: 6
Зарегистрирован: June 2023
Junior Member
Такие команды тоже не работают при первом запуске программы. Хотя запись заносится в таблицу. Я ХЗ что не так... почему не выполняется последовательно код.
  procedure TFUpdate.sButton1Click(Sender: TObject);
  begin
  FDataModule.FDQueryRead.Close;
  FDataModule.FDQueryRead.SQL.Clear;
  FDataModule.FDQueryRead.SQL.Text:='select max(CLD_DATE) from CALENDAR';
  FDataModule.FDQueryRead.Open;
  LastDate:=FDataModule.FDQueryRead.FieldByName('MAX').AsDateTime;
  begin
    while LastDate<=Date do
    begin
      FDataModule.FDTransactionWrite.StartTransaction;
      try
        FDataModule.FDQueryWrite.Close;
        FDataModule.FDQueryWrite.SQL.Clear;
        FDataModule.FDQueryWrite.SQL.Text:='update or insert into CALENDAR (CLD_DATE) values (:CldDate) matching(CLD_DATE)';
        FDataModule.FDQueryWrite.Params.ParamByName('CldDate').AsDate:=LastDate;
        FDataModule.FDQueryWrite.ExecSQL;
        FDataModule.FDTransactionWrite.Commit;
      except
        FDataModule.FDTransactionWrite.Rollback;
      raise;
      end;
    LastDate:=LastDate+1;
    end;
  end;

  LastDate:=Date;
  FDataModule.FDQueryRead.Close;
  FDataModule.FDQueryRead.SQL.Clear;
  FDataModule.FDQueryRead.SQL.Text:='select CLD_DATE from CALENDAR where CLD_DATE=:CurDate';
  FDataModule.FDQueryRead.Params.ParamByName('CurDate').AsDate:=LastDate;
  FDataModule.FDQueryRead.Open;
  sMemo1.Text:=DateToStr(FDataModule.FDQueryRead.FieldByName('CLD_DATE').AsDateTime);
  end;
Предыдущая тема: Lazarus dll debug
Следующая тема: FireDac и 32-х и 64-битные библиотеки вендоров
Переход к форуму:
  


Текущее время: Sat May 04 02:20:45 GMT+3 2024

Общее время, затраченное на создание страницы: 0.00724 секунд