2

HTMLページ全体を含むphpから文字列が渡されるJavaScriptコードが少しあるとしましょう。文字列を現在のドキュメントに書き込み、それを含む要素の 1 つを変更します。このようなもの:

<script type="text/javascript">
var foo = <?php echo $html_document;?>;
document.open();
document.write(foo);
document.close();
document.getElementById("some_id_within_html_document").innerHTML = "some stuff";
</script>

これにより、目的の出力が得られます。このページのソースを表示する場合を除いて、すべてが見栄えがします。後でこのページをスクレイピングして同じことをしたい場合、ブラウザによって解釈される html の代わりに JavaScript が表示されます。このメソッドを使用して、JavaScript が生成するのではなく、目的の HTML をスクレイピングするにはどうすればよいでしょうか? 代わりにphpで文字列を処理することでこの問題を回避しましたが、ソースを表示したりページをスクレイピングしたりするときに、解釈されたHTMLをこのように表示できるかどうかはまだ興味があります.

編集: 全体的に素晴らしい反応です。ここで実際に何が起こっているのか、どのような慣行を避けるべきかについて多くのことを学びました. 私が最初に抱えていた問題に関して、最小限の努力しか必要としない最も簡単な解決策は、Justin Wood によって提供されました。

4

4 に答える 4

3

何をしようとしているのか正確にはわかりませんが、次のようなものを使用して、生成/変更された DOM に相当する HTML を確認できます。

document.documentElement.innerHTML

また:

document.getElementById("some_id").innerHTML

デモを参照してください。

次のコードを含むブックマークレットを作成できます。

alert(document.documentElement.innerHTML);

表示するすべてのページで、JavaScript によって変更された DOM の HTML を表示します。

アップデート:

サーバーで Web スクレイピングを行い、外部Web ページをダウンロードする場合は、その JavaScriptを実行し、JavaScript の実行後に DOM に対応する HTML を確認します (document.write 呼び出しなどを使用)。次に、ZombieまたはPhantomを使用してみてください。Zombie をサポートする PHP ツールについては、Minkも参照してください。

一般的には、JavaScript エンジンを搭載したヘッドレス ブラウザを検索します。

ここで他の回答に書かれていることとは反対に、実際には可能です。

于 2012-10-03T00:28:23.027 に答える
1

あなたはそうしない。HTMLはソースのピリオドにありません。元のHTMLには、実行する必要のあるJavascriptが含まれています。そのJavascriptは、ページのDOMを操作して、さらに多くのものを追加します。元のHTMLは変更されず、Javascriptのみが含まれています。

Javascriptで生成されたコンテンツを「スクレイプ」する場合は、常にJavascriptとDOMを含むページ全体を解析して実行し、結果として変更されたDOMを評価する必要があります。

于 2012-10-03T00:08:02.627 に答える
1

PHP 変数を JavaScript に渡さないでください。変数自体を出力するだけで、JavaScriptを使用して編集したいものを編集できます...

<?php
$html = "<html><head><title></title></head><body><p id='p'>Something</p></body></html>";

echo $html;
?>

<script type="text/javascript">
  document.getElementById("p").innerHTML = "blah";
</script>

そのようなものはあなたのために働くはずです。

注:これは、chrome、FF、および safari でのみテストしました

于 2012-10-03T00:13:04.673 に答える
0

JavaScriptはクライアント側の言語であるため、ページのソースを表示するときにJavaScriptが実行されないため、視覚的な結果とソースの間に不一致が生じます。同じ結果を得るには、JSをPHPまたは別のサーバーサイド言語に置き換える必要があります。

さらに、JavaScriptを引き続き使用する場合は、JavaScriptの実行後に、すべてのHTMLノードを保持するDOMまたはドキュメントオブジェクトを表示する必要があります。これを行う1つの方法は、Chromeのインスペクター(CTRT + SHIFT + I)または(右クリック->この要素のインスペクト)を使用することです。

于 2012-10-03T00:08:23.427 に答える