从现有站点选择性复制HTML + CSS + JS的工具[关闭]


403

像大多数Web开发人员一样,我偶尔也喜欢查看网站的来源,以了解其标记的构建方式。Firebug和Chrome开发者工具之类的工具使检查代码变得容易,但是如果我要复制一个孤立的部分并在本地使用它,则复制所有单个元素及其关联的CSS会很痛苦。保存整个源代码并剪切不相关的代码可能需要做很多工作。

如果可以在Firebug中右键单击一个节点并具有“为该节点保存HTML + CSS”选项,那就太好了。是否存在这样的工具?是否可以扩展Firebug或Chrome开发者工具来添加此功能?


4
只需添加即可(不是您所描述的工具,因此无法给出答案),如果您使用的是chrome,则可以选择一个元素,然后查看css部分右侧的“计算机样式”。您将能够将整个列表复制粘贴到样式中。这是您所需工具的一个额外步骤,但是却为您提供了所需的CSS。
riv_rec 2011年

1
不是您问题的完整答案,但是Chrome开发人员工具中“元素”标签上的F2会打开所选的DOM元素和子树以进行内联编辑(并根据需要进行复制)。
10gistic 2013年

chrome的一个非常有趣的扩展是“保存所有资源”。安装它,然后导航到Chrome Dev Tool选项卡的“ Resources Saver”并下载!
dimeros

Answers:


580

SnappySnippet

我终于找到了一些时间来创建此工具。您可以从Github 安装SnappySnippet。它允许从指定的(最后检查)的DOM节点轻松提取HTML + CSS。另外,您可以将代码直接发送到CodePen或JSFiddle。请享用!

SnappySnippet Chrome扩展

其它功能

  • 清理HTML(删除不必要的属性,修复缩进)
  • 优化CSS以使其可读
  • 完全可配置(可以关闭所有过滤器)
  • 用作品::before::after伪元素
  • 出色的UI,要归功于BootstrapFlat-UI项目

SnappySnippet是开源的,您可以在GitHub上找到代码

实作

既然我在学习本书的过程中学到了很多东西,所以我决定分享一些我遇到的问题以及我的解决方案,也许有人会觉得它很有趣。

第一次尝试-getMatchedCSSRules()

首先,我尝试检索原始CSS规则(来自网站上的CSS文件)。令人惊讶的是,这非常简单,这要归功于window.getMatchedCSSRules(),但是效果并不理想。问题在于,我们只采用了在整个文档的上下文中匹配的HTML和CSS选择器的一部分,而在HTML片段的上下文中不再匹配。由于解析和修改选择器似乎不是一个好主意,因此我放弃了这一尝试。

第二次尝试-getComputedStyle()

然后,我从@CollectiveCognition建议的内容开始- getComputedStyle()。但是,我真的想分离CSS表单HTML,而不是内联所有样式。

问题1-将CSS与HTML分开

这里的解决方案不是很好,但是很简单。我已经为选定子树中的所有节点分配了ID,并使用该ID创建了适当的CSS规则。

问题2-删除具有默认值的属性

为节点分配ID效果很好,但是我发现我的每条CSS规则都有大约300个属性,使整个CSS难以理解。
事实证明,该方法getComputedStyle()返回为给定元素计算的所有可能的CSS属性和值。其中一些为空,一些具有浏览器默认值。要删除默认值,我必须先从浏览器中获取它们(每个标签具有不同的默认值)。解决方案是将来自网站的元素的样式与插入到空白元素中的相同元素进行比较<iframe>。这里的逻辑是,在empty中没有样式表<iframe>,因此我在其中附加的每个元素都只有默认的浏览器样式。这样,我就可以摆脱大多数无关紧要的属性。

问题3-仅保留速记属性

我发现的下一件事情是,不必要地打印了具有速记等效项的属性(例如,先有border: solid black 1px然后border-color: black;border-width: 1pxitd)。
为了解决这个问题,我只创建了一个具有速记等效项的属性列表,并将它们从结果中过滤掉。

问题4-删除前缀属性

在每个规则属性的数量先前的操作后,显著回落,但我发现,我窗台有很多的-webkit-前缀属性,我从来没有听到(-webkit-app-region-webkit-text-emphasis-position?)。
我想知道我是否应该保留这些特性,因为他们中的一些似乎是有益(-webkit-transform-origin-webkit-perspective-origin等等)。不过,我还没有弄清楚如何验证这一点,并且由于我知道大多数时候这些属性只是垃圾,因此我决定将其全部删除。

问题5-合并相同的CSS规则

我发现的下一个问题是重复重复相同的CSS规则(例如,对于每个<li>样式完全相同的样式,在CSS输出中创建的规则相同)。
这只是将规则相互比较并将具有完全相同的一组属性和值的规则组合在一起的问题。结果,不是#LI_1{...}, #LI_2{...}我得到了#LI_1, #LI_2 {...}

问题6-清理和修复HTML缩进

由于对结果感到满意,因此我转向了HTML。它看起来像一团糟,主要是因为该outerHTML属性将其格式设置与从服务器返回的格式完全相同。
唯一需要的HTML代码outerHTML是简单的代码重新格式化。由于它在每个IDE中都可用,因此我确定有一个JavaScript库可以做到这一点。结果证明我是对的(jquery-clean)。而且,我还有一些多余的属性去除(styledata-ng-repeat等等)。

问题7-过滤器破坏CSS

由于在某些情况下上述过滤器可能会破坏代码段中的CSS,因此我将所有过滤器都设为可选。您可以从“ 设置”菜单禁用它们。


@KonradDzwinel,我正在寻找一种在页面内以编程方式执行此操作的方法(要打印特定的DOM子树,只需将其复制到新窗口中,然后单击即可print())。将其单独作为可调用函数在JS中做起来有多难(对于您或某人希望分叉您的仓库)?
Hashbrown

@Hashbrown给我发邮件,我们可以谈谈细节-我认为这将非常简单。
Konrad Dzwinel 2013年

@KonradDzwinel非常感谢您的努力,但是如果我想使用php函数'file_get_contents($ url)'获取node元素,有什么解决办法,这是我的文章:stackoverflow.com/questions/21419857/ …
Yassine edouiri 2014年

做得好!但是是否可以包含作用于元素的js代码?
t31321 2014年

1
@KonradDzwinel已经有人殴打我了:github.com/kdzwinel/SnappySnippet/issues/37
David Keaveny'2

52

我最初问这个问题是在寻找Chrome(或FireFox)解决方案,但我在Internet Explorer开发人员工具中偶然发现了此功能。我在寻找什么(JavaScript除外)

具有样式的元素源

结果:

具有样式结果的元素源


5
IE11也可以。但是可以直接在元素上单击鼠标右键访问该选项。
Rodolfo Jorge Nemer Nogueira 2014年

15
哇,最后是IE devtools更好的例子!
dmnd

7
我尝试过的最佳解决方案与本页中列出的所有其他解决方案进行比较。生成的CSS + HTML非常干净,同时保留了原始CSS名称,这意味着html与原始CSS相同。
xoofx 2014年

真是太棒了。可以确认@xoofx的发现,即HTML标记保持不变,但想进一步说明它还输出真正匹配样式所需的骨架父包装元素。
Daniel Sokolowski

用这个。无法使简洁的代码段正常工作(复杂的html和css)。我不敢相信这确实有效。就像人们知道的那样,我在Edge Just Explorer中没有看到此功能。
沃森

51

Webkit浏览器(不确定FireBug)允许您轻松复制元素的HTML,因此这是过程的一部分。

在复制元素的HTML之前运行此命令(在javascript控制台中),会将给定的父元素以及所有子元素的所有计算出的样式移动到内联样式属性中,该属性随后将作为HTML的一部分提供。

var el = document.querySelector("#someid");
var els = el.getElementsByTagName("*");

for(var i = -1, l = els.length; ++i < l;){

    els[i].setAttribute("style", window.getComputedStyle(els[i]).cssText);

}

这是一个完全的hack,您将有很多“垃圾” css属性可供使用,但至少应该让您开始。


3
很好的答案,但是...与实际答案无关,for ... loop语法有什么用?它对我来说很模糊。
史蒂夫·坎贝尔

1
很好,只是错过了根元素。也添加此代码:el.setAttribute(“ style”,window.getComputedStyle(el).cssText);
卡曼·凯特斯

在chrome控制台中,.querySelector为我返回了null。因此,将其更改为以下内容并起作用:var el = document.getElementById(“#someid”); el.setAttribute(“ style”,window.getComputedStyle(el).cssText); var els = el.getElementsByTagName(“ *”); for(var i = -1,l = els.length; ++ i <l;){els [i] .setAttribute(“ style”,window.getComputedStyle(els [i])。cssText); }
Viktor Tango 2014年


25

这可以通过名为scrapbook的Firebug插件来完成

您可以在设置中检查Javascript选项

在此处输入图片说明

编辑:

也可以帮助

Firequark是Firebug的扩展,可帮助HTML屏幕抓取过程。Firequark使用Firebug(Firefox的网络开发插件)自动从网页中提取单个或多个html节点的css选择器。可以将生成的css选择器作为html屏幕抓取工具(例如Scrapi)的输入,以提取信息。Firequark旨在释放CSS选择器的功能,以使用html屏幕抓取功能。


剪贴簿看起来很棒-不幸的是,最新版本(1.4.5)和评论中建议的上一个版本(1.4.3)在OSX / FF3.6.1上都不适用于我。有人在工作吗?
peteorpeter

我希望我可以更精确地选择要保存的节点,但是效果很好
kenwarner 2011年

1
这有点帮助,但是并不能解决我将具有所需CSS的页面元素移动到另一页面的需要。剪贴簿会复制所有页面css,无论页面的选定部分是否需要css,并且它不会对css进行任何重写,从而避免样式与另一页面的css冲突。
mc0e 2015年

13

divclip是Florentin Sardan的 htmlclipper的更新版本

具有现代增强功能:ES5,HTML5,范围内的CSS ...

您可以通过以下方式以编程方式提取样式化div:

var html = require("divclip").bySel(".article-body");
console.log(html);

请享用。


太棒了!奇迹般有效!我做了一些修改,以便可以只在chrome中运行。只需删除'export'和'require'依赖项,然后将它们复制到chrome片段即可。然后可以在控制台中键入copy(divclip.bySel('.topbar'))将已处理的输出复制到剪贴板!;)
肯2015年

发生错误:shellprod.msocdn.com/16.00.1692.002/zh-CN/JSC/O365ShellG2Plus.js:21无法在“ DOMWindow”上执行“ postMessage”:提供的目标来源(“ portal.office.com”)可以与收件人窗口的来源不匹配(“ null”)。
斯拉瓦

10

无需插件。只需单击一下即可使用Internet Explorer 11本机开发人员工具非常简单地完成它,非常干净。就在元素上并检查该元素,然后右键单击某个块,然后选择“使用样式复制元素”。您可以在下图中看到它。

它提供了非常干净的CSS代码,例如

.menu { 
    margin: 0;
}
.menu li {
    list-style: none;
}

哇,这在Microsoft Edge中效果很好。尝试了htmlclipper和snappysnippet,但在保留我要复制的元素的响应能力方面存在问题。
马特

这太神奇了,效果很好。
snit80


3

我不知道只有一个解决方案的工具,但是您可以同时使用Firebug和Web Developer扩展

使用Firebug复制所需的html部分(检查元素),然后使用Web Developer查看与元素相关联的css(将Web Developer称为“查看样式信息”,它的工作方式类似于Firebug的“ Inspect Element”,但不显示html)标记,它显示具有该标记的关联CSS。

这不正是你想要的(一切点击),但它是相当接近,并且至少直观。

Web开发人员扩展的“查看样式信息”结果


这是我要做的,但是它涉及手动复制每个元素的CSS。我认为OP理想的情况是可以复制影响一个元素和所有嵌套元素的CSS样式-像复制HTML一样一次性复制它。
Muhd

3

我还在Firebug上需要此功能!在此之前,另一种方法是使用在线服务删除类并将CSS转换为内联样式。



2

只需从网页上复制所需的部分,然后将其粘贴到所见即所得的编辑器中即可。通过单击编辑器工具栏上的“源”按钮来检查html源。

当我在Drupal网站上工作时,我发现了这种最简单的方法。我使用所见即所得的CKeditor。


2
jQuery.fn.extend({
getStyles: function() {
    var rulesUsed = [];
    var sheets = document.styleSheets;
    for (var c = 0; c < sheets.length; c++) {
        var rules = sheets[c].rules || sheets[c].cssRules;
        for (var r = 0; r < rules.length; r++) {
            var selectorText = rules[r].selectorText.toLowerCase().replace(":hover","");
            if (this.is(selectorText) || this.find(selectorText).length > 0) {
                rulesUsed.push(rules[r]);
            }
        }
    }
    var style = rulesUsed.map(function(cssRule) {
        return cssRule.selectorText.toLowerCase() + ' { ' + cssRule.style.cssText.toLowerCase() + ' }';
    }).join("\n");
    return style;
}
});

用法:$("#login_wrapper").getStyles()


对于我的需求,这看起来很有希望,因为它避免了getComputedStyle的限制。我只是一个JavaScript新手而已,无法确定如何使用它来获取CSS的实际文本。
mc0e 2015年

我已经更改了用法,jQuery而不是使用$,这使我有了一些办法,但是现在我得到了SecurityError: The operation is insecure. 任何指针吗?
mc0e 2015年

0

我已将票数最高的答案改编为Dragabble小书签。

只需访问 此页面并将“运行jQuery代码”按钮拖到书签栏即可。


1
给出错误:错误:SyntaxError:未终止的字符串文字
Barney

@Barney:他的意思是,您应该在此处复制答案并从中摘录。这不是答案,但我建议在评论中代替答案
Mo Hrad


0

我浏览了这里提到的所有工具作为答案。但是它们给您反复,肮脏的HTML CSS以及您凝视的美丽面孔。他们不给你JS。

我做的事:

  1. 首先,我过滤了页面上不需要的广告
  2. 然后,保存完整的网页以及链接资源。
  3. 删除不必要的HTML,CSS和JS
  4. 保持小心地一对一地断开资源链接。
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.