質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Internet Explorer

Internet Explorer(IE;MSIE)はマイクロソフトが開発したウェブブラウザです。Microsoft Windowsに組み込まれています。

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

Q&A

解決済

2回答

2933閲覧

PowerShellでframe要素で構成されたhtmlページのドキュメント取得について

Jingles

総合スコア8

Internet Explorer

Internet Explorer(IE;MSIE)はマイクロソフトが開発したウェブブラウザです。Microsoft Windowsに組み込まれています。

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

0グッド

0クリップ

投稿2017/10/02 21:02

PowerShellを使用してframe要素で構成されたページをスクレイピングしたいのですが、どうしても内容の取得ができずに困っております。
環境はwin7,PSバージョン2.0,IE11となります。

スタックオーバーフローで同じ質問をしているページ
HtmlDocument クラス
HtmlWindow クラス
↑この辺のページを参考に考えてみましたがどうにも上手くいきませんでした。
考えた、というよりは思いつくまま試した結果良く解らなかったという感じです。
実は最近、某知恵袋で似たような質問をした経緯があります。
PowerShellを始めたばかりで苦戦しています。知恵をお借りしたいです。

下記、frame要素のサンプルページを例に記述したコードになります。
http://www.tagindex.com/html_tag/frame/example_f01.html

#サンプルページを開いて可視化 $ie = New-Object -ComObject InternetExplorer.Application $ie.Navigate("http://www.tagindex.com/html_tag/frame/example_f01.html") $ie.Visible = $true #読み込み完了まで待機 While($ie.busy -eq $true -or ($ie.ReadyState -ne "4") ){ Start-Sleep -s 1 } #思いつくまま試してみた失敗作とエラー内容 <# foreach($elements In $ie.document.frames.item[0].document.body){ echo $elements.InnerHtml } (null 配列にインデックスを付けることはできません。) foreach($elements In $ie.document.frames[0].document.body){ echo $elements.InnerHtml } (型 System.__ComObject のオブジェクトにインデックスを付けることはできません。) foreach($elements In $ie.document.frames.document.body){ echo $elements.InnerHtml } (親要素だけが返ってくる) foreach($elements In $ie.document.frames.body){ echo $elements.InnerHtml } (親要素だけが返ってくる) foreach($elements In $ie.document.window.frames...){ echo $elements.InnerHtml } (何も返ってこない) foreach($elements In $ie.document.window.WindowFrameElement...){ echo $elements.InnerHtml } (何も返ってこない) #>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

こんにちは。
PowerShellに限らず、COMでIEを操作する際はOSやIEのバージョンによって取得可能なオブジェクトが異なり、いろいろと挙動が異なる様です。(私も完全に理解しているわけではありません...)

まずは、提示されたコード例に対して

powershell

1$ie.Document | Get-Member

と打ってみて、Documentの型が何になるか確認してみてください。

  • TypeName: mshtml.HTMLDocumentClassの場合

この場合は$ie.document.framesが取得でき、失敗した例もうまく動作する様です。
手元のWindows 10、IE 11、PowerShell 5.1な環境ではこのクラスのオブジェクトが取れました。

  • TypeName: System.__ComObject#{c59c6b12-f6c1-11cf-8835-00a0c911e8b2} (Jscriptのオブジェクトらしい...) の場合

この場合は、IEの「互換表示」の設定をするとうまく動作するかもしれません。

参考 : https://social.technet.microsoft.com/Forums/ja-JP/02cd48a5-5236-4a4e-8a66-0c8a5b67ceaf/powershelliegetelementbyid

  • TypeName: System.__ComObject#{3050f55f-98b5-11cf-bb82-00aa00bdce0b} (DispHTMLDocument) の場合

この場合、手元の環境では$ie.document.framesが取得できる場合とできない場合がありました。
Frameオブジェクトが取得できればそれを使えば良いと思います。

Frameオブジェクトが取得できない場合は

$ie.Document.getElementsByTagName("frame")

の様にタグ名からFrameを取るしかない様です。

投稿2017/10/03 04:02

stknohg

総合スコア796

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

framesはコレクションではないので、itemメソッドで取得する
というstackoverflowのコードでframe毎に取得できました。

環境はWindows10、PowerShell 5.1、IE11です。

$ie = New-Object -ComObject InternetExplorer.Application $ie.Navigate("http://www.tagindex.com/html_tag/frame/example_f01.html") $ie.Visible = $true While($ie.busy -eq $true -or ($ie.ReadyState -ne "4") ){ Start-Sleep -s 1 } $frames = $ie.document.frames #echo "left frame" #echo $frames.item(0).document #echo "right frame" #echo $frames.item(1).document for ($i=0; $i -lt $frames.length; $i++){ echo $frames.item($i).document }

投稿2017/10/03 04:10

shimitei

総合スコア799

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問