Delphi 如何使用TIdHTTP中的字符串创建IHTMLDocument2?

Delphi 如何使用TIdHTTP中的字符串创建IHTMLDocument2?,delphi,html-parsing,indy,ihtmldocument,Delphi,Html Parsing,Indy,Ihtmldocument,我下载了一个带有IdHTTP.Get的URL,我需要搜索HTML标记并提取一些数据 如何将IdHTTP.Get返回的字符串转换为IHTMLDocument2?我搜索了这个问题,找到了一个很好的代码: Idoc := CreateComObject(Class_HTMLDOcument) as IHTMLDocument2; try IDoc.designMode := 'on'; while IDoc.readyState <> 'complete' do Appli

我下载了一个带有
IdHTTP.Get
的URL,我需要搜索HTML标记并提取一些数据


如何将
IdHTTP.Get
返回的字符串转换为
IHTMLDocument2

我搜索了这个问题,找到了一个很好的代码:

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;
Idoc:=CreateComObject(类\u HTMLDOcument)作为IHTMLDocument2;
尝试
IDoc.designMode:=“打开”;
而IDoc.readyState“完成”执行
Application.ProcessMessages;
v:=VarArrayCreate([0,0],varvarvariant);
v[0]:=MyHTML;
写(PSafeArray(System.TVarData(v.VArray));
IDoc.designMode:=“关闭”;
而IDoc.readyState“完成”执行
Application.ProcessMessages;
解析HTML(IDoc);
最后
IDoc:=零;
结束;
关于

试试这个:

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;

谢谢,但这篇文章使用了twebbrowser,我不会使用webbrowser。因为我不需要html呈现,我只需要html文本来提取数据,速度对我来说非常重要。使用流方式加载文档怎么样?
IdHTTP
具有
Get
方法重载,允许您接收对流的响应(实际上用于返回字符串的方法)。我不会使用该代码。无需使用所有
designMode
应用程序。ProcessMessages
检查
readyState
。您无需切换到
designMode=on
即可写入
IHTMLDocument
。我强烈建议您使用@Keeper's code。@kobik,有趣的是,在Windows 7上,甚至在导入MSHTML类型库的Delphi 7(个人)上,Keeper's code在
IHTMLDocument2::write
行中使用
无效参数时也会失败。同样的情况也发生在
psafarray(vararrayaspafarray(VarArrayOf([HTMLWideString]))
@TLama上,我通常将
document
声明为
OleVariant
,并通过后期绑定创建它,例如:
document:=CreateComObject(CLASS_HTMLDocument)作为IDispatch
使用
document.write()
。也许这就是为什么我从来没有遇到过这个问题(?)。@kobik,它适用于Delphi附带的类型库,但如果您自己导入它(Windows 7),则不会。更奇怪的是,对于
IHTMLDocument2
接口,它们是相同的。