zanjibar
@zanjibar (tadashi nagao)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Javascript による表示をHTMLとして取得するにはどうしたらいいでしょうか?

Q&A

Closed

輸入動向を調べる(モニタリングシステム) のようなJavascript で表示していると思われるページは、HTMLの保存を行っても、表示されているテキストを取得できません。取得したいのは画像で、HS9用というところです。HS9 コードが全部表示されているかをチェックしたいのです。
FireShot Capture 042 - 輸入動向を調べる(モニタリングシステム) (METI_経済産業省) - www.meti.go.jp.png
この部分のデータを取得するにはどうしたらいいのでしょうか?

0

3Answer

ページ内のjavascriptで作っているならinnerHTMLで取得できるでしょうけど、ちょうどこの画像の部分はインラインフレームになっていてtableau.com側が処理しているため中身を見るのは無理っぽいですね。

1Like

Comments

  1. @zanjibar

    Questioner

    selenium でも無理でしょうか?
  2. MDN:インラインフレーム要素https://developer.mozilla.org/ja/docs/Web/HTML/Element/iframe/#Scripting

    > フレームの内容にアクセスするスクリプトは、同一オリジンポリシーに従います。
    > 別なオリジンから読み込まれたスクリプトは、フレーム内のスクリプトがフレームの親にアクセスする場合を含め、
    > 他の window オブジェクトのほとんどのプロパティにアクセスできません。

    「フレームの中身が別ドメインの場合は、安全のためフレームをまたいで要素にアクセスすることはできないよ」ってことです。

    selenium自身はhttpクライアントとして動作するのではなく、ブラウザからデータをもらっている立場にすぎないのでこのルールに縛られます。

インラインフレームになっていている、という事情は @albireo さんの回答の通りです。
以下、補足です。

Selenium ではフレーム要素を扱えます

現在、Selenium のバックエンド は WebDriver です。 WebDriver には フレームを扱う API があります

フレームに埋め込まれたページに直接アクセスする方法もあります

この質問の例ですと、iframe には、
https://public.tableau.com/views/202006_bouekitoukei/sheet0?:embed=y&:showVizHome=no&:host_url=https%3A%2F%2Fpublic.tableau.com%2F&:embed_code_version=3&:tabs=yes&:toolbar=yes&:animate_transition=yes&:display_static_image=no&:display_spinner=no&:display_overlay=yes&:display_count=yes&:language=ja&:loadOrderID=0
というページが埋め込まれています。こういったページに直接アクセスしても構わない場合もあります。

必ずしもスクレイピングが最短な手段ではありません

データをデータとしてダウンロードしてから扱う方が簡単なことも多いです。この例ですと tableau がデータのダウンロードを提供しています。
(これは質問者さんのニーズとはずれたことと思いますが、スクレイピングにこだわり過ぎて苦労している方が多いようですので一応、付記いたしました)

1Like

Comments

  1. @zanjibar

    Questioner

    ダウンロードのリンクありますね。。。。。。
var FIText = document.getElementsByClassName("FIText");
for (var i=0; i<FIText.length; i++) {
	console.log(FIText[i].innerText);
}
0Like

Comments

  1. @zanjibar

    Questioner

    試してみます。これを,selenium で実行するといいということですね。

Your answer might help someone💌