Вопрос по indy, ihtmldocument, html-parsing, delphi – Как мне создать IHTMLDocument2, используя строку из TIdHTTP?

6

Я загружаю URL сIdHTTP.Getи мне нужно искать теги HTML и извлекать некоторые данные.

Как я могу преобразовать строку, котораяIdHTTP.Get возвращается вIHTMLDocument2?

спасибо, но эта статья использовала twebbrowser, и я не буду использовать webbrowser. потому что мне не нужен HTML рендеринг, мне просто нужен текст HTML для извлечения данных, и скорость очень важна для меня. SadeghAlavizadeh

Ваш Ответ

2   ответа
5

uses
  ... Variants, MSHTML, ActiveX;

var Cache: string;
    V: OleVariant;
    Doc: IHTMLDocument2;
begin
  ...

  Cache := IdHTTP.Get(url);
  Doc := coHTMLDocument.Create as IHTMLDocument2; // create IHTMLDocument2 instance
  V := VarArrayCreate([0,0], varVariant);
  V[0] := Cache;
  Doc.Write(PSafeArray(TVarData(v).VArray)); // write data from IdHTTP

  // Work with Doc
end;
3

Idoc := CreateComObject(Class_HTMLDOcument) as IHTMLDocument2;
try
  IDoc.designMode := 'on';
  while IDoc.readyState <> 'complete' do
    Application.ProcessMessages;
  v := VarArrayCreate([0, 0], VarVariant);
  v[0] := MyHTML;
  IDoc.Write(PSafeArray(System.TVarData(v).VArray));
  IDoc.designMode := 'off';
  while IDoc.readyState <> 'complete' do
    Application.ProcessMessages;

  ParseHTML(IDoc);
finally
  IDoc := nil;
end;

С уважением

Как насчет использования потокового способа загрузки документа?IdHTTP имеетGet Перегрузка метода, позволяющая получить ответ на поток (фактически используется в том, который возвращает вам строку).
@TLama, я обычно заявляюdocument какOleVariant и создать его с помощью позднего связывания, например:document := CreateComObject(CLASS_HTMLDocument) as IDispatch и просто использоватьdocument.write(<WideString>), Может быть, поэтому я никогда не сталкивался с этой проблемой (?) ...
Я бы не использовал этот код. всеdesignMode а такжеApplication.ProcessMessages ПроверятьreadyState не нужен Вам не нужно переключаться наdesignMode=on для того, чтобы иметь возможность написатьIHTMLDocument, Я настоятельно рекомендую вам использовать код @ Keeper.
@ kobik, интересно то, что этот код и даже код Keeper не работают наIHTMLDocument2::write линия сInvalid argument в Windows 7, Delphi 7 (Personal) с импортированной библиотекой типов MSHTML. То же самое происходит сPSafeArray(VarArrayAsPSafeArray(VarArrayOf([HTMLWideString]))).
@kobik, он работает с библиотекой типов, поставляемой с Delphi, но не может, если вы импортируете ее самостоятельно (Windows 7). Еще более странным является то, что они одинаковы дляIHTMLDocument2 интерфейс.

Похожие вопросы