查看网页生成源的最佳方法?


84

我正在寻找一种工具,该工具将为我提供正确的生成源,包括AJAX请求对W3的验证器输入进行的DOM更改。我尝试了以下方法:

  1. Web开发人员工具栏-根据doc类型生成无效的源(例如,它删除标记的自闭合部分)。丢失页面的doctype部分。
  2. Firebug-修复源代码中的潜在缺陷(例如未关闭的标签)。也丢失标签的doctype部分,并注入本身是无效HTML的控制台。
  3. IE开发者工具栏-根据doc类型生成无效的源(例如,根据XHTML规范,使所有标记都变为大写)。
  4. 高亮显示+视图选择源-通常很难获取整个页面,也排除了doc类型。

是否有任何程序或附加组件可以为我提供确切的当前源版本,而无需以某种方式进行修复或更改?到目前为止,Firebug似乎是最好的,但是我担心它可能会解决我的一些错误。

事实证明,正如贾斯汀所解释的那样,我想要的并没有确切的解决方案。最好的解决方案似乎是在Firebug控制台内部验证源,即使其中包含由Firebug引起的一些错误。我还要感谢“被遗忘的分号”解释了为什么“查看生成的源”与实际源不匹配。如果我可以标记2个最佳答案,我会的。


嗯,我以为他在要求相反的要求-服务器发出的确切HTML。杰里米?
贾斯汀·格兰特(

没关系,只是看到了新评论。现在,您正在尝试做什么变得更有意义了-感谢您的澄清。我将相应地更新答案。
贾斯汀·格兰特(

值得注意的是,这篇文章的许多浏览者都忽略了要点,即静态源不能用于分析已被javascript修改过的页面。Firebug对此非常有用,但是如果有和IE工具能够做到这一点,那就太好了,因为浏览器兼容性是IE的一个大问题。
Paul Keister

1
Firebug无法修复HTML中的任何错误。它只是将标记从Firefox DOM中渲染出来。Firebug 1.6避免添加元素;对于所有版本的Firebug,您可以通过禁用控制台面板来避免更改DOM。
johnjbarton

1
我从这个问题中学到了很多!
谢尔盖·奥尔尚斯基

Answers:


32

[更新以响应已编辑问题中的更多详细信息]

您遇到的问题是,一旦页面被ajax请求修改,当前的HTML仅存在于浏览器的DOM内-除了可以提取的内容之外,不再有任何其他可以验证的独立源HTML。 DOM。

如您所见,IE的DOM以大写形式存储标记,修复未封闭的标记,并对原始HTML进行许多其他更改。这是因为浏览器通常非常擅长处理有问题的HTML(例如未关闭的标签),并修复这些问题以显示对用户有用的内容。据我所知,一旦IE对HTML进行了规范化,从DOM的角度来看,原始的源HTML基本上就丢失了。

Firefox大多数likley所做的这些更改较少,因此Firebug可能是您更好的选择。

最终的(且劳动强度更大)的选项可能适用于具有简单ajax更改的页面,例如,从服务器获取一些HTML并将其导入到特定元素内的页面中。在这种情况下,您可以使用提琴手或类似工具将原始HTML与Ajax HTML手动缝合在一起。这可能比其应有的麻烦还多,并且容易出错,但这是另一种可能性。

[这里是对原始问题的原始答复]

Fiddler(http://www.fiddlertool.com/)是一个免费的,独立于浏览器的工具,可以很好地获取浏览器接收到的HTML。它显示了线路上的确切字节以及解码/解压缩/等内容,您可以将其提供给任何HTML分析工具。它还显示了标头,计时,HTTP状态以及许多其他有用的东西。

如果要测试服务器如何响应略有不同的标头,也可以使用fiddler复制和重建请求。

Fiddler充当代理服务器,位于您的浏览器和网站之间,并记录双向流量。


熟悉Fiddler,这不是完成我想要的操作的简单方法(在用户更改页面后查看页面的生成源)。
杰里米·考夫曼

1
他需要在javascript修改dom后的页面来源。
拜伦·惠特洛克

我不是拒绝投票的人,但您的答案与问题本身无关。自您发表评论以来,该问题可能已被编辑。
bradlis7

是的,我知道,现在。。。最初的问题没有提到重要的细节。:-)从OP获得新信息后,我就更新了答案。但是我认为我的原始答案是对原始问题的合理答案。即使这不是最佳答案(我更喜欢被遗忘的分号!),但我想知道是什么使我的答案不值一票。没什么大不了的,只是想知道。
贾斯汀·格兰特

感谢您对当前仅存在于浏览器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已在第二行之后被解析并丢弃。

修改从JavaScript文件正确的方法是用document方法(createElementappendChildsetAttribute等),你会观察到有任何的那些功能标签或HTML语法没有提及。如果您正在使用document.writeinnerHTML或其他使用HTML的通话来修改您的网页,则验证该网页的唯一方法是捕获您要输入的内容并分别验证该HTML。

也就是说,获得文档的HTML表示的最简单方法是:

document.documentElement.innerHTML

1
因此,换句话说,这就像编译程序,使用某些工具优化或以其他方式修改代码,甚至是用病毒感染程序,然后索要结果的源代码。HTML-> DOM转换是一种单向函数。
谢尔盖·奥尔尚斯基

+1,该死的,它可以在每次修改之前和之后查看代码。思维很聪明!谢谢
jimjim

这可能是正确的,但并不能完全回答问题。完全有可能将当前操作的DOM转换回HTML,从而可以“查看生成的源”。有时这很有用,例如,如果您需要根据实际的测试工具检查单个JavaScript。
superluminary

21

我知道这是一个旧帖子,但是我才发现这块金币。这是旧的(2006),但仍适用于IE9。我个人为此添加了一个书签。

只需将其复制粘贴到浏览器的地址栏中:

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

至于Firefox,Web开发工具栏可以完成这项工作。我通常使用此功能,但有时,一些肮脏的第三方asp.net控件会根据用户代理生成不同的标记...

编辑

正如Bryan在评论中指出的那样,某些浏览器javascript:在复制/粘贴到网址栏中时会删除该部分。我刚刚测试过,IE10就是这种情况。


哇,这确实是PURE GOLD!单击书签,效果很好。至少在Firefox中确实如此。使用Chrome,弹出窗口已呈现-可能会忽略“文本/纯文本”?
乔恩·库姆斯

我将其复制粘贴到浏览器的地址栏中,然后按Enter,什么也没发生
eMi 2015年

1
@eMi我在这里有IE10,它不允许我粘贴javascript:零件,我必须手动键入它。也许就是这样。仔细检查粘贴的内容。
Johnny5

1
在Mac OSX上的Google Chrome浏览器(至少从v44.0.2403.155版开始)上,@ Johnny5制作的小书签不会产生包含打开程序源的纯文本页面,但是Chrome浏览器尝试呈现HTML,但没有CSS,从它的外观。
戴夫·兰德

@ Johnny5可能值得一提,因为javascript:在某些浏览器中执行复制/粘贴操作时,答案会被切断。刚刚在Chrome浏览器中遇到了该问题。
布赖恩

12

如果您在Chrome中加载文档,则Developer|Elements视图将显示HTML和JS代码。它不是直接HTML文本,您必须打开(展开)任何感兴趣的元素,但是您可以有效地检查生成的HTML。


11
在Google Chrome浏览器的Inspect Element中,您可以右键单击任何元素,然后单击“复制为HTML”
JasonPlutext 2010年

3
@Jason非常感谢您。右键单击<html>元素,然后选择“复制为HTML”,这正是我今天在Chrome中所需要的。
DaveGauer 2011年

11

在Web开发人员工具栏中,您是否尝试过Tools -> Validate HTMLTools -> Validate Local HTML选项?

Validate HTML选项将URL发送到验证器,该验证器与面向公众的站点配合使用。该Validate Local HTML选项将当前页面的HTML发送到验证器,该验证器可与登录后的页面或不可公开访问的页面配合使用。

您可能还想尝试查看源图表(也可以作为FireFox附加组件)。有趣的是:

问:为什么查看源图表将我的XHTML标签更改为HTML标签?

答:不是。浏览器正在进行这些更改,VSC仅显示浏览器对您的代码所做的工作。最常见:自结束标记会丢失其斜杠(/)。有关更多信息,请参见Rendered Source上的这篇文章 (archive.org)


我没有进行过表决,但是“验证HTML”不会发送生成的HTML,而是原始源。(请参见修改后的问题)
Pekka,

我只是试过了,它似乎没有提交生成的源(即DOM更改的源),但是可以使用firefox的“查看源”选项看到该源。
杰里米·考夫曼

改变我的球门柱!
被遗忘的分号

1
我以为“查看生成的源代码”将使问题的这一部分变得清楚,但从到目前为止的4个答案来看,我显然是错误的:)
杰里米·考夫曼

查看源图表的链接已断开
Casebash 2010年

6

使用Firefox Web开发者工具栏(https://addons.mozilla.org/en-US/firefox/addon/60

只需转到查看源->查看生成的源

我一直在用它做同样的事情。


现在,您会看到您在编辑中使用工具栏引用Doctype问题的情况。这是一个公平的批评,我无话可说。
lewsid

3
效果很好,现在已内置在原始Firefox中。Ctrl + A,右键单击E。此外,请参阅Johnny5发现的出色的书签。
乔恩·库姆斯

在Firefox中:右键单击要查看的生成内容的页面,然后单击Web Developer>查看源代码>查看生成的源代码
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/
维基/撬棍

它给了我错误的,无效的HTML。


还要检查本系列的其他部分:第2部分第3部分
贾巴

撬棍似乎不再在那里
Mousey

不太用户友好,但仍然可以通过SVN下载:devres.zoomquiet.io/data/20110810165553/index.html
adamvagyok,2015年

5

这是一个老问题,下面是一个古老的答案已经一次完美为我工作了很多年,但并没有任何更多,至少不会像2016年1月的:

SquareFree的“ Generated Source”书签let完全可以满足您的要求-并且不同于@ Johnny5的其他精美“旧金”,它显示为源代码(而不是由浏览器正常呈现,至少在Google情况下) Mac上的Chrome):

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

不幸的是,它的行为就像@ Johnny5中的“旧金”一样:它不再显示为源代码。抱歉。


4

在Firefox中,只需按ctrl-a(选择屏幕上的所有内容),然后右键单击“查看选择源”。这将捕获JavaScript对DOM所做的任何更改。


如果页面已单击右键,则无法使用。
凯文·怀特富特


3

为什么不输入网址栏呢?

javascript:alert(document.body.innerHTML)

1
+1:在IE 10的地址栏中没有为我工作,但在IE开发工具的控制台中效果很好。
SausageFingers

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 ;

我认为这需要有关如何使用它的具体说明。我假设您将代码粘贴到现有页面中,但是输出将到达哪里?
乔恩·库姆斯


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,能否详细说明您的答案以更详细地解释(代码,详细的操作流程)?
Artem
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.