生成されたWebページのソースを表示する最良の方法は?


84

W3のバリデーターへの入力に対するAJAXリクエストによって行われたDOMの変更を含む、適切に生成されたソースを提供するツールを探しています。私は次の方法を試しました:

  1. Web開発者ツールバー-doc-typeに従って無効なソースを生成します(たとえば、タグの自己終了部分を削除します)。ページのdoctype部分を失います。
  2. Firebug-ソースの潜在的な欠陥(閉じられていないタグなど)を修正します。また、タグのdoctype部分が失われ、それ自体が無効なHTMLであるコンソールが挿入されます。
  3. IE開発者ツールバー-doc-typeに従って無効なソースを生成します(たとえば、XHTML仕様に対して、すべてのタグを大文字にします)。
  4. ハイライト+選択ソースの表示-ページ全体を取得するのが難しいことが多く、doc-typeも除外されます。

何らかの方法で修正または変更せずに、ソースの正確な現在のバージョンを提供するプログラムまたはアドオンはありますか?これまでのところ、Firebugは最高のようですが、私の間違いのいくつかが修正されるのではないかと心配しています。

解決

ジャスティンが説明したように、私が望んでいたことに対する正確な解決策はないことがわかりました。最善の解決策は、Firebugによって引き起こされたエラーが含まれている場合でも、Firebugのコンソール内でソースを検証することであるようです。また、「生成されたソースの表示」が実際のソースと一致しない理由を説明してくれたForgottenSemicolonにも感謝します。2つのベストアンサーをマークできれば、そうします。


うーん、私は彼が逆を求めていると思いました-サーバーによって発行された正確なHTML。ジェレミー?
ジャスティングラント

気にしないで、新しいコメントを見ただけです。今、あなたがやろうとしていることがより理にかなっています-明確にしてくれてありがとう。それに応じて答えを更新します。
ジャスティングラント

この投稿の多くの視聴者が要点を見逃していることは注目に値します。それは、JavaScriptによって変更されたページを分析するために静的ソースを使用できないということです。Firebugはこれには最適ですが、ブラウザの互換性はIEの大きな問題であるため、同じことを行うIEツールがあれば便利です。
Paul Keister

1
FirebugはHTMLのエラーを修正しません。FirefoxDOMからタグをレンダリングするだけです。Firebug 1.6は、要素の追加を回避します。Firebugのすべてのバージョンで、コンソールパネルを無効にすることでDOMの変更を回避できます。
johnjbarton 2010

1
この質問からたくさんのことを学びました!
Sergey Orshanskiy 2013年

回答:


32

[編集された質問の詳細に応じて更新]

あなたが遭遇している問題は、ページがajaxリクエストによって変更されると、現在のHTMLはブラウザのDOM内にのみ存在することです-あなたが引き出すことができるもの以外に検証できる独立したソースHTMLはもうありませんDOM。

ご覧のとおり、IEのDOMはタグを大文字で格納し、閉じられていないタグを修正し、元々取得したHTMLに他の多くの変更を加えます。これは、ブラウザは一般に、問題のあるHTML(たとえば、閉じられていないタグ)を取得し、それらの問題を修正してユーザーに役立つものを表示するのに非常に優れているためです。HTMLがIEによって正規化されると、私が知る限り、元のソースHTMLはDOMの観点から本質的に失われます。

Firefoxのほとんどのリクレイはこれらの変更をほとんど行わないので、Firebugがおそらくあなたのより良い賭けです。

最後の(そしてより労働集約的な)オプションは、単純なajaxの変更があるページで機能する場合があります。たとえば、サーバーからHTMLをフェッチし、これを特定の要素内のページにインポートします。その場合、フィドラーまたは同様のツールを使用して、元のHTMLとAjaxHTMLを手動でつなぎ合わせることができます。これはおそらく価値があるよりも厄介であり、エラーが発生しやすいですが、もう1つの可能性があります。

[元の質問に対する元の回答はこちら]

Fiddler(http://www.fiddlertool.com/)は、ブラウザに依存しない無料のツールであり、ブラウザが受信した正確なHTMLを取得するのに非常に適しています。ワイヤー上の正確なバイトと、任意のHTML分析ツールにフィードできるデコード/解凍などのコンテンツが表示されます。また、ヘッダー、タイミング、HTTPステータス、およびその他の多くの優れた機能も表示されます。

サーバーがわずかに異なるヘッダーにどのように応答するかをテストする場合は、フィドラーを使用してリクエストをコピーおよび再構築することもできます。

Fiddlerは、ブラウザとWebサイトの間に位置するプロキシサーバーとして機能し、双方向のトラフィックをログに記録します。


Fiddlerに精通しているので、私がやりたいことを簡単に行う方法ではありません(ユーザーが変更した後、生成されたページのソースを表示します)。
ジェレミーカウフマン

1
彼は、javascriptがdomを変更した後、ページのソースを求めています。
バイロンホイットロック

私は反対票を投じたわけではありませんが、あなたの答えは質問自体とは何の関係もありません。コメントしてから質問が編集されている可能性があります。
bradlis7 2009年

うん、私は今それを知っている...しかし、元の質問はその重要な詳細について言及していませんでした。:-) OPから新しい情報を入手したら、回答を更新しました。しかし、私の最初の答えは、元の質問に対する合理的な答えだったと思います。それが最良の答えではありませんが(私はForgotten Semicolonの方がはるかに優れているのが好きです!)、なぜ私の答えが反対票に値するのか疑問に思っています。大したことではない、ただ疑問に思う。
ジャスティングラント

ブラウザのDOM内にのみ存在する現在のHTMLに関するこの説明に感謝します。これが私の問題の核心であり、私が尋ねたときにそれを理解していませんでした。それは私が求めていることは本質的に不可能であると私に信じさせます。
ジェレミーカウフマン

34

ジャスティンは死んでいる。ここで重要なのは、HTMLはドキュメントを記述するための単なる言語であるということです。ブラウザがそれを読み取ると、それはなくなります。オープンタグ、クローズタグ、およびフォーマットはすべてパーサーによって処理されますその後消えます。HTMLを表示するツールはすべて、ドキュメントのコンテンツに基づいてHTMLを生成しているため、常に有効です。

私はこれを別のWeb開発者に一度説明しなければならず、彼がそれを受け入れるのに少し時間がかかりました。

任意のJavaScriptコンソールで自分で試すことができます。

el = document.createElement('div');
el.innerHTML = "<p>Some text<P>More text";
el.innerHTML; // <p>Some text</p><p>More text</p>

そのHTMLは解析され、2行目以降に破棄されたため、閉じられていないタグと大文字のタグ名はなくなりました。

JavaScriptからのドキュメントを修正するための正しい方法はであるdocumentメソッド(createElementappendChildsetAttribute、など)、あなたはそれらの機能のいずれかのタグまたはHTML構文への参照がないことを確認します。を使用している場合document.writeinnerHTMLまたはあなたのページを修正するために、他のHTML圏の呼び出し、それを検証する唯一の方法は、HTML別途ことをあなたがそれらに入れているものをキャッチし、検証することです。

とはいえ、ドキュメントのHTML表現を取得する最も簡単な方法は次のとおりです。

document.documentElement.innerHTML

1
したがって、この答えを言い換えると、これは、プログラムをコンパイルしたり、ツールを使用してコードを最適化または変更したり、プログラムをウイルスに感染させたりして、結果のソースコードを要求するようなものです。変換HTML-> DOMは一方向性関数です。
Sergey Orshanskiy 2013年

+1、聖なる地獄、それは各変更の前後のコードを見るために働きます。とても賢い思考!ありがとう
jimjim 2015

これは本当かもしれませんが、質問に完全には答えていません。現在操作されているDOMをHTMLに戻すことは完全に可能であり、「生成されたソースを表示」することができます。これは、たとえば、JavaScriptの1つの部分を現実的なテストハーネスと照合する必要がある場合などに、非常に役立つ場合があります。
スーパールミナリー2016年

21

これが古い投稿であることは知っていますが、この金の部分を見つけました。これは古い(2006)ですが、IE9でも機能します。これで個人的にブックマークを追加しました。

これをブラウザのアドレスバーにコピーして貼り付けるだけです。

javascript:void(window.open("javascript:document.open(\"text/plain\");document.write(opener.document.body.parentNode.outerHTML)"))

Firefoxに関しては、Web開発者ツールバーがその役割を果たします。私は通常これを使用しますが、時々、いくつかのダーティなサードパーティのasp.netコントロールは、ユーザーエージェントに基づいて異なるマークアップを生成します...

編集

ブライアンがコメントで指摘したように、一部のブラウザjavascript:は、URLバーにコピー/貼り付けするときにその部分を削除します。私はちょうどテストしました、そしてそれはIE10の場合です。


うわー、これは確かにピュアゴールドです!ブックマークを1回クリックするだけでうまく機能します。少なくとも、Firefoxでは今はそうです。Chromeでは、ポップアップがレンダリングされました。「テキスト/プレーン」を無視しているのではないでしょうか。
Jon Coombs 2015年

これをブラウザのアドレスバーにコピーして貼り付け、Enterキーを
押し

1
@eMiここにIE10がありますが、javascript:パーツを貼り付けることができません。手動で入力する必要があります。多分それが起こることです。貼り付け内容を再確認してください。
Johnny5 2015年

1
MacOSXのGoogleChrome(少なくともv44.0.2403.155以降)では、@ Johnny5によるブックマークレットは、オープナーのソースを含むプレーンテキストページにはなりませんが、ChromeはHTMLをレンダリングしようとしますが、CSSはありません。それの外観から。
デイ

@ Johnny5はjavascript:、一部のブラウザでコピー/貼り付けを行うと途切れる回答のメモとして言及する価値があるかもしれません。Chromeでその問題が発生しました。
ブライアン

12

ドキュメントをChromeに読み込むと、Developer|ElementsビューにはJSコードがいじられたHTMLが表示されます。これは直接HTMLテキストではなく、関心のある要素を開く(展開する)必要がありますが、生成されたHTMLを効果的に検査することができます。


11
Google Chromeでは、要素の検査で、任意の要素を右クリックして「HTMLとしてコピー」できます
JasonPlutext 2010

3
@ジェイソンありがとうございます。<html>要素を右クリックして[HTMLとしてコピー]を選択すると、今日のChromeで必要なものが正確に得られました。
DaveGauer 2011年

11

Web開発者ツールバーで、Tools -> Validate HTMLまたはを試しましたかTools -> Validate Local HTMLオプション?

このValidate HTMLオプションは、URLをバリデーターに送信します。バリデーターは公開されているサイトでうまく機能します。ザ・Validate Local HTMLオプションは、現在のページのHTMLをバリデーターに送信します。バリデーターは、ログインの背後にあるページや、一般公開されていないページでうまく機能します。

ソースチャートの表示FireFoxアドオンとしても)を試すこともできます。そこに興味深いメモ:

Q. View Source ChartがXHTMLタグをHTMLタグに変更するのはなぜですか?

A.そうではありません。ブラウザはこれらの変更を行っています。VSCはブラウザがコードに対して行ったことを表示するだけです。最も一般的な方法:自己終了タグは終了スラッシュ(/)を失います。詳細については、レンダリングされたソースに関するこの記事 (archive.org)を参照してください


私は反対票を投じませんでしたが、「validate HTML」は、生成されたHTMLではなく、元のソースを送信します。(編集された質問を参照)
Pekka

私はこれを試しましたが、生成されたソース(つまり、DOMが変更されたソース)を送信するようには見えませんが、Firefoxの「ソースの表示」オプションで表示されるソースです。
ジェレミーカウフマン

私のゴールポストを変える!
忘れられたセミコロン

1
「ビュー生成ソース」で質問のその部分が明確になると思いましたが、これまでの4つの回答から判断すると、明らかに間違っていました:)
Jeremy Kauffman

ソースチャートの表示へのリンクが壊れています
Casebash 2010

6

Firefox Web Developerツールバーの使用(https://addons.mozilla.org/en-US/firefox/addon/60

[ソースの表示]-> [生成されたソースの表示]に移動するだけです

私はいつもまったく同じことのためにそれを使用しています。


そして、ツールバーのDoctypeの問題を引用した編集が表示されます。それは公正な批判であり、私は他に何も示唆することはありません。
lewsid 2009年

3
うまく機能し、今ではバニラFirefoxに組み込まれています。Ctrl + A、右クリック、E。また、Johnny5が見つけた優れたブックマークレットも参照してください。
Jon Coombs

Firefoxの場合:表示したい生成コンテンツのあるページを右クリックし、次にWeb開発者>ソースの表示>生成ソースの表示
Mark Gavagan

5

私は同じ問題を抱えていました、そして私はここで解決策を見つけました:

http://ubuntuincident.wordpress.com/2011/04/15/scraping-ajax-web-pages/

したがって、ここからのツールであるCrowbarを使用するには:

http://simile.mit.edu/wiki/Crowbar(現在(2015-12)404s)
ウェイバックマシンリンク:http//web.archive.org/web/20140421160451/http://simile.mit.edu/
wiki / Crowbar

それは私に欠陥のある無効なHTMLを与えました。


このシリーズの他のパートもチェックしてください:パート2パート3
ジャバ2012


あまりユーザーフレンドリーではありませんが、SVNからダウンロードできます:devres.zoomquiet.io/data/20110810165553/index.html
adamvagyok

5

これは古い質問です。これは、かつて私にとって何年も問題なく機能していた古い回答です、少なくとも2016年1月の時点では機能していません。

SquareFreeの「GeneratedSource」ブックマークレットは、あなたが望むことを正確に実行します。@ Johnny5の「古いゴールド」とは異なり、(少なくともGoogleの場合は、ブラウザによって通常どおりにレンダリングされるのではなく)ソースコードとして表示されます。 Mac上のChrome):

https://www.squarefree.com/bookmarklets/webdevel.html#generated_source

残念ながら、@ Johnny5の「オールドゴールド」と同じように動作します。ソースコードとして表示されなくなりました。ごめんなさい。


4

Firefoxでは、ctrl-a(画面上のすべてを選択)してから、[選択ソースの表示]を右クリックします。これにより、JavaScriptによってDOMに加えられた変更がすべてキャプチャされます。


ページが右クリックをフックしている場合は機能しません。
ケビンホワイトフット2014


3

これを入力してみませんか?これはURLバーです。

javascript:alert(document.body.innerHTML)

1
+1:IE 10のアドレスバーでは機能しませんでしたが、IE開発ツールのコンソールではうまく機能しました。
SausageFingers 2013

3

[要素]タブで、[html]ノードを右クリック> [コピー]> [要素のコピー]を選択し、エディターに貼り付けます。

上で述べたように、ソースがDOMツリーに変換されると、元のソースはブラウザーに存在しなくなります。行う変更は、ソースではなくDOMに対して行われます。

ただし、変更されたDOMを解析してHTMLに戻すことで、「生成されたソース」を確認できます。

  1. Chromeで、開発ツールを開き、[要素]タブをクリックします。
  2. HTML要素を右クリックします。
  3. コピー>要素のコピーを選択します。
  4. エディターに貼り付けます。

これで、現在のDOMをHTMLページとして表示できます。

これは完全なDOMではありません

DOMをHTMLドキュメントで完全に表すことはできないことに注意してください。これは、DOMにはHTMLの属性よりもはるかに多くのプロパティがあるためです。ただし、これは妥当な仕事をします。


2

IE開発ツール(F12)にはあると思います。表示>ソース> DOM(ページ)

DOMをコピーして貼り付け、保存してバリデーターに送信する必要があります。


あなたもしたいかもしれません。[ファイル]> [Internet Explorerのビューソースをカスタマイズする]> [メモ帳]を使用すると、上記の操作を簡単に保存できます。
ハンコックは

1

私が見つけたのはSafariのBetterSource拡張機能だけです。これにより、ドキュメントの操作されたソースが表示されます。欠点は、Firefoxの場合とは異なります。


1

以下のjavascriptコードスニペットは、完全なajaxレンダリングされたHTML生成ソースを取得します。ブラウザに依存しないもの。楽しい :)

function outerHTML(node){
    // if IE, Chrome take the internal method otherwise build one as lower versions of firefox
        //does not support element.outerHTML property
  return node.outerHTML || (
      function(n){
          var div = document.createElement('div'), h;
          div.appendChild( n.cloneNode(true) );
          h = div.innerHTML;
          div = null;
          return h;
      })(node);
  }


 var outerhtml = outerHTML(document.getElementsByTagName('html')[0]);
var node = document.doctype;
var doctypestring="";
if(node)
{
     // IE8 and below does not have document.doctype and you will get null if you access it.

 doctypestring = "<!DOCTYPE "
         + node.name
         + (node.publicId ? ' PUBLIC "' + node.publicId + '"' : '')
         + (!node.publicId && node.systemId ? ' SYSTEM' : '') 
         + (node.systemId ? ' "' + node.systemId + '"' : '')
         + '>';
         }
         else

         {

             // for IE8 and below you can access doctype like this

         doctypestring = document.all[0].text;
         }
doctypestring +outerhtml ;

使い方については具体的な指示が必要だと思います。コードを既存のページに貼り付けると思いますが、出力はどこに行きますか?
Jon Coombs 2015年


0

ajax呼び出しの結果をコンソールに記録することで、同様の問題を解決することができました。これは返されたhtmlであり、問​​題があれば簡単に確認できました。

ajax呼び出しの.done()関数で、console.log(results)を追加して、デバッガーコンソールでhtmlを確認できるようにしました。

function GetReversals() {
    $("#getReversalsLoadingButton").removeClass("d-none");
    $("#getReversalsButton").addClass("d-none");

    $.ajax({
        url: '/Home/LookupReversals',
        data: $("#LookupReversals").serialize(),
        type: 'Post',
        cache: false
    }).done(function (result) {
        $('#reversalResults').html(result);
        console.log(result);
    }).fail(function (jqXHR, textStatus, errorThrown) {
        //alert("There was a problem getting results.  Please try again. " + jqXHR.responseText + " | " + jqXHR.statusText);
        $("#reversalResults").html("<div class='text-danger'>" + jqXHR.responseText + "</div>");
    }).always(function () {
        $("#getReversalsLoadingButton").addClass("d-none");
        $("#getReversalsButton").removeClass("d-none");
    });
}


@erbarke、あなたの答えについてもっと詳しく説明してもらえますか(コード、詳細なアクションフロー)?
アルテム2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.