3

Internet Explorer Web ブラウザ ウィンドウのテキスト コンテンツを取得しようとしています。

私は次の手順に従っています:

  1. IHTMLDocument2 へのポインターを取得する
  2. IHTMLDocument2 から本文を IHTMLElement として取得し
    ます 3. 本文で get_innerText を呼び出します

編集


  1. body のすべての子を取得し、すべての IHTMLElements に対して再帰呼び出しを試みます。
  2. 表示されていない要素を取得した場合、またはタグがスクリプトである要素を取得した場合、その要素とそのすべての子を無視します。

私の問題は

  1. ページに表示されるテキストとともに、どの スタイル=「表示:なし」のコンテンツも取得します
  2. google.com の場合、テキストとともに JavaScript も取得します。

私は再帰的なアプローチを試みましたが、このようなシナリオに対処する方法については無知です.

<div>
Hello World 1
<div style="display: none">Hello world 2</div>
</div>

このシナリオでは、「Hello World 1」を取得できません

IHTMLDocument2* からテキストを取得する最良の方法を教えてください。私は C++ Win32 を使用していますが、MFC や ATL は使用していません。

ありがとう、アシッシュ。

4

1 に答える 1

6

要素を逆方向に繰り返す場合document.body.allは、常に要素を裏返しに処理します。したがって、自分で再帰的に歩く必要はありません。DOM がそれを行います。例 (コードは Delphi にあります):

procedure Test();
var
  document, el: OleVariant;
  i: Integer;
begin
  document := CreateComObject(CLASS_HTMLDocument) as IDispatch;
  document.open;
  document.write('<div>Hello World 1<div style="display: none">Hello world 2<div>This DIV is also invisible</div></div></div>');
  document.close;
  for i := document.body.all.length - 1 downto 0 do // iterate backwards
  begin
    el := document.body.all.item(i);
    // filter the elements
    if (el.style.display = 'none') then
    begin
      el.removeNode(true);
    end;
  end;
  ShowMessage(document.body.innerText);
end;

サイドコメント: 再帰的アプローチを使用したシナリオについては:

<div>Hello World 1<div style="display: none">Hello world 2</div></div>

たとえば、要素が最初の DIV である場合、el.getAdjacentText('afterBegin')が返され"Hello World 1"ます。したがって、おそらく要素を繰り返し処理して を収集できますgetAdjacentText('afterBegin')が、各要素の親をテストする必要があるため、これは少し難しくなりel.currentStyle.displayます。

于 2012-04-09T09:19:12.250 に答える