delphi - 如何获取列出的网页的所有元素Id?

标签 delphi delphi-7 twebbrowser

我无法获取 Twebbrowser 控件中加载的网页的所有元素 ID。有人可以帮助我实现这一目标吗? 我想将元素 id 保存在列表框或类似的内容中,但知道如何获取所有元素就足够了。

非常感谢!

最佳答案

下面将扫描 TWebBrowser 的内容并将其节点的 ID 属性放入 TMemo 中。

// Note : You need to add MSHTML to your Uses list if it's not there already

procedure TForm1.GetIDs;
var
  All : IHTMLElementCollection;
  Doc : IHtmlDocument2;
  E : IHtmlElement;
  i : Integer;
  S : String;
begin
  Doc := IDispatch(WebBrowser1.Document) as IHtmlDocument2;
  Assert(Doc <> Nil);
  All := IDispatch(Doc.all) as IHTMLElementCollection;
  for i := 0 to All.Length - 1 do begin
    E := IDispatch(All.Item(i, 0)) as IHtmlElement;
    S :=IntToStr(i) + ' ' + E.id;
    Memo2.Lines.Add(S);
  end;
end;

这使用了 MSHTML.Pas 中定义的 DOM 对象的接口(interface)。 MS 的 DOM 对象有很多内容,您需要沉浸其中一段时间​​才能习惯。请参阅此处了解方法:

https://msdn.microsoft.com/en-us/library/aa703928%28v=vs.85%29.aspx#properties

即使从我的(过于)简单的示例中也可以看出,使用它往往需要在原始接口(interface)和 OleVariants 中封装的接口(interface)之间进行大量跳跃,如

  All := IDispatch(Doc.all) as IHTMLElementCollection;

顺便说一句,上面的代码使用“早期绑定(bind)”到 MSHTML.Pas 中定义的界面对象。您将看到的许多使用这些对象的示例代码都使用 OleVariants(即“后期绑定(bind)” - 如果您不确定早期绑定(bind)和后期绑定(bind)之间的区别,请参阅 OLH)。以下是上述代码的后期绑定(bind)版本。

procedure TForm1.GetIDs2;
var
  All,
  Doc,
  E : OleVariant;
  i : Integer;
  S : String;
begin
  Doc := WebBrowser1.Document;
  All := Doc.all;
  for i := 0 to All.Length - 1 do begin
    E := All.Item(i);
    S :=IntToStr(i) + ' ' + E.id;
    Memo2.Lines.Add(S);
  end;
end;

通常,后期绑定(bind)更容易用于实验和让事情最初工作,因为它允许省略可选参数,并且不需要您使用类型化接口(interface)变量。缺点是 IDE 不会在后期绑定(bind)接口(interface)上执行代码完成,并且执行速度较慢。

示例 HTML:

<html>
  <body>
    <div ID="adiv" style="TEXT-ALIGN: left; color: Gray">Some text
      <div ID="asubdiv" style="TEXT-ALIGN: left; color: Gray">Subdiv</div>
    </div>
    <div style="TEXT-ALIGN: left; color: Gray">Some more text</div>
    <div ID="cdiv" style="TEXT-ALIGN: left; color: Gray">Some even more text</div>
  </body>
</html>

关于delphi - 如何获取列出的网页的所有元素Id?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32828078/

相关文章:

string - 询问用户并将响应发送回消息接收器

delphi - 从 Delphi 应用程序接收 MS Word 的自动化事件

delphi - WebBrowser1DocumentComplete 和 WebBrowser1NavigateComplete2

delphi - 为什么我的Delphi 7调试器会随机决定停止接受某些键盘输入

delphi - OLE自动化: How to check if a variant references an automation object

database - CoInitialize错误在线程内使用数据库

delphi - 如何禁用 "TWebbrowser"上的 JavaScript 错误?

javascript - 如何在 FireMonkey TWebBrowser 中旋转照片

delphi - 如何读取AD显示名称

delphi - 从资源加载位图