我无法获取 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/