如何获取列出的所有元素ID网页?

时间:2015-09-28 16:52:56

标签: delphi delphi-7 twebbrowser

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

非常感谢!

1 个答案:

答案 0 :(得分:2)

以下内容将扫描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对象的接口。 MS的DOM对象有很多,你需要沉浸其中一段时间​​才能习惯它。请看这里的方式:

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

正如您从我的(简单)简单示例中看到的那样,使用它往往需要在原始接口和OleVariants包装的接口之间进行大量跳转,如

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

顺便说一下,上面的代码使用&#34;早期绑定&#34;到MSHTML.Pas中定义的接口对象。您将看到的许多用于处理这些对象的示例代码使用OleVariants(即&#34;后期绑定&#34; - 如果您不确定早期和晚期绑定之间的区别,请参阅OLH)。以下是上述代码的后期版本。

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;

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

示例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>