Các công cụ sao chép có chọn lọc HTML + CSS + JS từ các trang web hiện có [đã đóng]


403

Giống như hầu hết các nhà phát triển web, tôi thỉnh thoảng muốn xem nguồn của các trang web để xem cách đánh dấu của họ được xây dựng. Các công cụ như Fireorms và Chrome Developer Tools giúp dễ dàng kiểm tra mã, nhưng nếu tôi muốn sao chép một phần bị cô lập và chơi xung quanh nó cục bộ, sẽ rất khó để sao chép tất cả các yếu tố riêng lẻ và css liên quan của chúng. Và có lẽ chỉ cần làm việc nhiều để lưu toàn bộ nguồn và cắt bỏ mã không liên quan.

Sẽ thật tuyệt nếu tôi có thể nhấp chuột phải vào một nút trong Fireorms và có tùy chọn "Lưu HTML + CSS cho nút này". Liệu một công cụ như vậy tồn tại? Có thể mở rộng Fireorms hoặc Chrome Developer Tools để thêm tính năng này không?


4
Chỉ muốn thêm (không phải là một công cụ như bạn mô tả, vì vậy không đưa ra câu trả lời), nếu bạn sử dụng chrome, bạn có thể chọn một yếu tố và xem "Kiểu tính toán" ở bên phải trong phần css. Bạn sẽ có thể sao chép-dán toàn bộ danh sách vào một kiểu. Đó là một bước bổ sung từ một công cụ bạn muốn, nhưng cung cấp cho bạn css mà bạn đang tìm kiếm.
Riv_rec

1
Không phải là một câu trả lời hoàn chỉnh cho câu hỏi của bạn, nhưng F2 trong các công cụ phát triển Chrome trên tab "Các phần tử" sẽ mở ra phần tử DOM và phần phụ được chọn để chỉnh sửa nội tuyến (và sao chép nếu bạn muốn).
10gistic

Một tiện ích mở rộng rất thú vị của chrome là "Lưu tất cả tài nguyên". Cài đặt nó và sau đó điều hướng đến "Trình tiết kiệm tài nguyên" của tab Chrome Dev Tool và tải xuống!
dimeros

Câu trả lời:


580

SnappySnippet

Cuối cùng tôi đã tìm thấy một chút thời gian để tạo ra công cụ này. Bạn có thể cài đặt SnappySnippet từ Github. Nó cho phép trích xuất HTML + CSS dễ dàng từ nút DOM được kiểm tra (kiểm tra lần cuối). Ngoài ra, bạn có thể gửi mã của mình thẳng đến CodePen hoặc JSFiddle. Thưởng thức!

Tiện ích mở rộng của SnappySnippet Chrome

Các tính năng khác

  • làm sạch HTML (loại bỏ các thuộc tính không cần thiết, sửa lỗi thụt lề)
  • tối ưu hóa CSS để làm cho nó dễ đọc
  • cấu hình đầy đủ (tất cả các bộ lọc có thể được tắt)
  • làm việc với ::before::aftercác yếu tố giả
  • Giao diện người dùng đẹp nhờ các dự án Bootstrap & Flat-UI

SnappySnippet là mã nguồn mở và bạn có thể tìm thấy mã trên GitHub .

Thực hiện

Vì tôi đã học được khá nhiều trong khi thực hiện điều này, tôi đã quyết định chia sẻ một số vấn đề tôi gặp phải và giải pháp của tôi cho họ, có thể ai đó sẽ thấy nó thú vị.

Nỗ lực đầu tiên - getMatchedCSSRules ()

Lúc đầu, tôi đã thử truy xuất các quy tắc CSS gốc (đến từ các tệp CSS trên trang web). Thật đáng ngạc nhiên, điều này rất đơn giản nhờ window.getMatchedCSSRules(), tuy nhiên, nó đã không hoạt động tốt. Vấn đề là chúng tôi chỉ lấy một phần của bộ chọn HTML và CSS phù hợp với ngữ cảnh của toàn bộ tài liệu, không phù hợp nữa trong ngữ cảnh của đoạn mã HTML. Vì phân tích cú pháp và sửa đổi các bộ chọn dường như không phải là một ý tưởng hay, tôi đã từ bỏ nỗ lực này.

Lần thử thứ hai - getComputingStyle ()

Sau đó, tôi đã bắt đầu từ thứ gì đó mà @CollectiveCognition gợi ý - getComputedStyle(). Tuy nhiên, tôi thực sự muốn tách HTML dạng CSS thay vì nội tuyến tất cả các kiểu.

Vấn đề 1 - tách CSS khỏi HTML

Giải pháp ở đây không đẹp lắm nhưng khá đơn giản. Tôi đã gán ID cho tất cả các nút trong cây con đã chọn và sử dụng ID đó để tạo quy tắc CSS phù hợp.

Vấn đề 2 - loại bỏ các thuộc tính với các giá trị mặc định

Việc gán ID cho các nút hoạt động tốt, tuy nhiên tôi phát hiện ra rằng mỗi quy tắc CSS của tôi có ~ 300 thuộc tính làm cho toàn bộ CSS không thể đọc được.
Hóa ra getComputedStyle()trả về tất cả các thuộc tính và giá trị CSS có thể được tính cho phần tử đã cho. Một số trong số đó trống, một số có giá trị mặc định của trình duyệt. Để xóa các giá trị mặc định, trước tiên tôi phải lấy chúng khỏi trình duyệt (và mỗi thẻ có các giá trị mặc định khác nhau). Giải pháp là so sánh các kiểu của phần tử đến từ trang web với phần tử tương tự được chèn vào một khoảng trống <iframe>. Logic ở đây là không có biểu định kiểu nào trong một khoảng trống <iframe>, vì vậy mỗi phần tử tôi đã thêm vào chỉ có các kiểu trình duyệt mặc định. Bằng cách này, tôi đã có thể loại bỏ hầu hết các tài sản không đáng kể.

Vấn đề 3 - chỉ giữ các thuộc tính tốc ký

Điều tiếp theo tôi đã phát hiện ra là các thuộc tính có tốc ký tương đương được in ra một cách không cần thiết (ví dụ: có border: solid black 1pxvà sau đó border-color: black;, border-width: 1pxitd.).
Để giải quyết điều này, tôi chỉ cần tạo một danh sách các thuộc tính có tốc độ tương đương và lọc chúng ra khỏi kết quả.

Vấn đề 4 - loại bỏ các thuộc tính tiền tố

Số lượng tài sản trong từng quy tắc đã được giảm đáng kể sau ca phẫu thuật trước đó, nhưng tôi đã thấy rằng tôi Sill đã có rất nhiều -webkit-tính chất tiền tố mà tôi chưa bao giờ nghe về ( -webkit-app-region? -webkit-text-emphasis-position?).
Tôi đã tự hỏi nếu tôi nên giữ bất kỳ thuộc tính nào trong số này vì một số trong số chúng có vẻ hữu ích ( -webkit-transform-origin, -webkit-perspective-originv.v.). Mặc dù vậy, tôi vẫn chưa tìm ra cách xác minh điều này và vì tôi biết rằng hầu hết thời gian các tài sản này chỉ là rác, tôi quyết định loại bỏ tất cả.

Vấn đề 5 - kết hợp các quy tắc CSS giống nhau

Vấn đề tiếp theo tôi đã phát hiện ra là các quy tắc CSS giống nhau được lặp đi lặp lại (ví dụ: mỗi quy tắc có <li>cùng kiểu chính xác có cùng một quy tắc trong đầu ra CSS được tạo).
Đây chỉ là vấn đề so sánh các quy tắc với nhau và kết hợp các quy tắc có cùng một bộ thuộc tính và giá trị. Kết quả là, thay vì #LI_1{...}, #LI_2{...}tôi nhận được #LI_1, #LI_2 {...}.

Vấn đề 6 - dọn dẹp và sửa lỗi thụt lề HTML

Vì tôi hài lòng với kết quả này, tôi đã chuyển sang HTML. Nó trông giống như một mớ hỗn độn, chủ yếu là do outerHTMLtài sản giữ cho nó được định dạng chính xác như được trả lại từ máy chủ.
Điều duy nhất mã HTML được lấy từ outerHTMLcần thiết là một định dạng lại mã đơn giản. Vì nó là thứ có sẵn trong mọi IDE, tôi chắc chắn rằng có một thư viện JavaScript thực hiện chính xác điều đó. Và hóa ra tôi đã đúng (jquery-clean) . Hơn thế nữa, tôi đã có không cần thiết thêm loại bỏ các thuộc tính ( style, data-ng-repeatvv).

Vấn đề 7 - bộ lọc phá vỡ CSS

Vì có khả năng trong một số trường hợp, các bộ lọc được đề cập ở trên có thể phá vỡ CSS trong đoạn trích, tôi đã làm cho tất cả chúng là tùy chọn. Bạn có thể vô hiệu hóa chúng từ menu Cài đặt .


@KonradDzwinel, tôi đang tìm cách để thực hiện việc này theo chương trình trong một trang (Để in một cây con DOM cụ thể, chỉ cần sao chép nó vào một cửa sổ mới và print()). Làm thế nào khó khăn (cho bạn hoặc cho ai đó tìm cách rẽ nhánh repo của bạn) để làm điều này trong một mình JS như là một hàm có thể gọi được?
Hashbrown

@Hashbrown Gửi thư cho tôi và chúng tôi có thể nói chi tiết - Tôi nghĩ nó sẽ khá đơn giản.
Konrad Dzwinel

@KonradDzwinel cảm ơn bạn rất nhiều vì nỗ lực, nhưng nếu tôi muốn lấy phần tử nút với hàm php 'file_get_contents ($ url)', thì có giải pháp nào không, đây là bài viết của tôi: stackoverflow.com/questions/21419857/ Tiết
Yassine edouiri

Công việc tuyệt vời nhưng có thể bao gồm mã js hoạt động trên phần tử không?
t31321

1
@KonradDzwinel ai đó đã đánh bại tôi với nó: github.com/kdzwinel/SnappySnippet/issues/37 .
David Keaveny

52

Ban đầu tôi đã hỏi câu hỏi này Tôi đang tìm kiếm một giải pháp Chrome (hoặc FireFox), nhưng tôi tình cờ thấy tính năng này trong các công cụ dành cho nhà phát triển Internet Explorer. Khá nhiều thứ tôi đang tìm kiếm (ngoại trừ javascript)

Nguồn phần tử với Phong cách

Kết quả:

Nguồn phần tử với kết quả Kiểu


5
IE11 cũng hoạt động. Nhưng tùy chọn có thể truy cập từ nhấp chuột phải trực tiếp vào yếu tố.
Rodolfo Jorge Nemer Nogueira

15
Wow, cuối cùng là một ví dụ trong đó các devtools IE là vượt trội!
dmnd

7
Giải pháp tốt nhất tôi đã thử so sánh với tất cả những người khác được liệt kê trong trang này. CSS + HTML được tạo là siêu sạch trong khi vẫn giữ các tên css gốc, có nghĩa là html giống với bản gốc.
xoofx

Holy crap đó là tuyệt vời. Có thể xác nhận những phát hiện của @xoustx rằng đánh dấu HTML vẫn giữ nguyên nhưng muốn bình luận thêm rằng nó cũng đưa ra các yếu tố gói cha mẹ cần thiết để thực sự phù hợp với phong cách.
Daniel Sokolowski

Đã sử dụng cái này. Không thể có được đoạn trích linh hoạt để hoạt động chính xác (html & css phức tạp). Tôi không thể tin rằng điều này thực sự hiệu quả. Và để mọi người biết, tôi đã không thấy tính năng này trong edge just explorer.
Watson

51

Các trình duyệt Webkit (không chắc chắn về FireBug) cho phép bạn sao chép HTML của một phần tử một cách dễ dàng, vì vậy đó là một phần của quy trình.

Chạy phần mềm này (trong bảng điều khiển javascript) trước khi sao chép HTML cho một phần tử sẽ di chuyển tất cả các kiểu được tính cho phần tử cha được cung cấp, cũng như tất cả các phần tử con, vào thuộc tính kiểu nội tuyến sẽ có sẵn như một phần của 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);

}

Đó là một bản hack hoàn toàn và bạn sẽ có rất nhiều thuộc tính css "rác" để lội qua, nhưng ít nhất nên bắt đầu.


3
Câu trả lời tuyệt vời, nhưng ... không liên quan đến câu trả lời thực tế, với cú pháp vòng lặp for ... thì sao? Nó đọc như bị xáo trộn với tôi.
Steve Campbell

1
Điều này là tuyệt vời, chỉ cần bỏ lỡ các yếu tố gốc. Thêm cái này nữa: el.setAttribution ("style", window.getComputingStyle (el) .cssText);
Karman Kertesz

trong bảng điều khiển chrome, .querySelector trả về null cho tôi. Vì vậy, thay đổi nó thành như sau và nó đã hoạt động: var el = document.getEuityById ("# someid"); el.setAttribution ("style", window.getComputingStyle (el) .cssText); var els = el.getElementsByTagName ("*"); for (var i = -1, l = els.length; ++ i <l;) {els [i] .setAttribution ("style", window.getComputingStyle (els [i]). cssText); }
Viktor Tango


25

Điều này có thể được thực hiện bởi Plugin Fireorms được gọi là sổ lưu niệm

Bạn có thể kiểm tra tùy chọn Javascript trong cài đặt

nhập mô tả hình ảnh ở đây

Biên tập:

Điều này cũng có thể giúp

Firequark là một phần mở rộng của Fireorms để hỗ trợ quá trình Quét màn hình HTML. Firequark tự động trích xuất bộ chọn css cho một hoặc nhiều nút html từ một trang web bằng cách sử dụng Fireorms (một plugin phát triển web cho Firefox). Bộ chọn css được tạo có thể được cung cấp làm đầu vào cho các trình dọn dẹp màn hình html như Scrapi để trích xuất thông tin. Firequark được xây dựng để giải phóng sức mạnh của bộ chọn css để sử dụng tính năng cạo màn hình html.


Sổ lưu niệm trông rất tuyệt - tiếc là cả phiên bản mới nhất (1.4.5) và phiên bản trước được đề xuất trong các đánh giá (1.4.3) sẽ không hoạt động với tôi trên OSX / FF3.6.1. Bất cứ ai có điều này làm việc?
peteorpeter

tôi ước tôi có thể chọn chính xác hơn một nút để lưu, nhưng điều này hoạt động khá tốt
kenwarner

1
Điều này khá hữu ích, nhưng không giải quyết được nhu cầu của tôi về việc di chuyển một yếu tố trang với css cần thiết sang một trang khác. Sổ lưu niệm sao chép tất cả các trang css, cho dù nó cần hay không cho phần được chọn của trang và nó không thực hiện bất kỳ thao tác viết lại nào của css sẽ giúp tránh các kiểu va chạm với css của trang khác.
mc0e

13

divclip là phiên bản cập nhật của htmlclipper của Florentin Sardan

với các cải tiến hiện đại: ES5, HTML5, CSS có phạm vi ...

bạn có thể trích xuất một div theo cách lập trình với:

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

Thưởng thức.


tuyệt vời hoạt động như một lá bùa! tôi đã thực hiện một số sửa đổi để nó chỉ có thể chạy trong chrome. chỉ cần loại bỏ sự phụ thuộc 'xuất' và 'yêu cầu' và sao chép chúng vào đoạn trích chrome. sau đó có thể trong bàn điều khiển, gõ copy(divclip.bySel('.topbar'))sẽ sao chép đầu ra được xử lý vào bảng tạm! ;)
ken

có lỗi: shellprod.msocdn.com/16.00.1692.002/en-US/JSC/O365ShellG2Plus.js:21 Không thể thực hiện 'postMessage' trên 'DOMWindow': Nguồn gốc đích được cung cấp (' Portal.office.com' ) không khớp với nguồn gốc của cửa sổ người nhận ('null').
Slava

10

Không có plugin cần thiết. Nó có thể được thực hiện rất đơn giản với Công cụ dành cho nhà phát triển bản địa của Internet Explorer 11 chỉ với một cú nhấp chuột, rất sạch sẽ. Chỉ cần vào một phần tử và kiểm tra phần tử đó, và nhấp chuột phải vào một số khối và chọn "Sao chép phần tử với kiểu". Bạn có thể nhìn thấy nó trong hình dưới đây.

Nó cung cấp mã css rất sạch sẽ, như

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

Wow, điều này đã làm việc hoàn hảo trong Microsoft Edge. Đã thử htmlclipper và snappysnippet nhưng có vấn đề trong việc duy trì khả năng phản hồi của các yếu tố tôi đang cố gắng sao chép.
Matt

Điều này thật tuyệt vời, hoạt động hoàn toàn tốt.
snit80 ngày

5

Gần đây tôi đã tạo một tiện ích mở rộng chrome "eXtract Snippet" để sao chép phần tử được kiểm tra, html và chỉ các truy vấn css và phương tiện có liên quan từ một trang. Lưu ý rằng điều này sẽ cung cấp cho bạn CSS có liên quan thực tế

https://chrom.google.com.vn/webstore/detail/extract-snippet/bfcjfegkgdoomgmofhcidoiampnpbdao?hl=vi


Tôi thích cách này giữ tất cả các bộ chọn như trong bản gốc.
hajamie

1
Làm thế nào để so sánh với phần mở rộng chrome snippet snappy?
Patoshi パ ト シ

3

Một công cụ với một giải pháp duy nhất cho điều này tôi không biết, nhưng bạn có thể sử dụng tiện ích mở rộng Firebird và Web Developer cùng một lúc.

Sử dụng Fireorms để sao chép phần html bạn cần (Kiểm tra phần tử) và Nhà phát triển web để xem css nào được liên kết với một phần tử (Gọi nhà phát triển web "Xem thông tin kiểu" - nó hoạt động như "Kiểm tra phần tử" của Fireorms, nhưng thay vì hiển thị html đánh dấu nó hiển thị CSS liên quan với đánh dấu đó).

Đó không phải là chính xác những gì bạn muốn (một cú nhấp chuột cho tất cả mọi thứ), nhưng nó khá gần gũi, và ít nhất là trực quan.

Kết quả 'Xem thông tin kiểu' từ Tiện ích mở rộng dành cho nhà phát triển web


Đây là những gì tôi làm, nhưng nó liên quan đến việc sao chép thủ công CSS cho từng thành phần. Điều tôi nghĩ rằng OP muốn lý tưởng là thứ gì đó có thể sao chép các kiểu CSS ảnh hưởng đến một phần tử và tất cả các phần tử lồng nhau - sao chép nó trong một lần như bạn làm cho HTML.
Muhd

3

Tôi cũng cần tính năng này trên Fireorms! Cho đến lúc đó, một cách tiếp cận khác là sử dụng dịch vụ trực tuyến này để loại bỏ các lớp và chuyển đổi css thành các kiểu nội tuyến.


3

http://clipboardjs.com làm điều này và khá tốt. Mặc dù sự mong đợi của bạn về phiên bản được sao chép chính xác như trong bản gốc để bạn có thể chơi và học với nó, có thể không thực tế.


2

Chỉ cần sao chép phần bạn muốn từ trang web và dán nó vào trình soạn thảo wysiwyg. Kiểm tra nguồn html bằng cách nhấp vào nút "nguồn" trên thanh công cụ biên tập.

Tôi đã tìm thấy cách dễ nhất này khi tôi đang làm việc trên một trang web Drupal. Tôi sử dụng wysiwyg 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;
}
});

sử dụng:$("#login_wrapper").getStyles()


Đối với nhu cầu của tôi, điều này có vẻ khá hứa hẹn, vì nó tránh được những hạn chế của getComputingStyle. Tôi chỉ là quá nhiều của một javascript để chắc chắn làm thế nào để sử dụng nó để có được văn bản thực tế của css.
mc0e

Tôi đã thay đổi cách sử dụng để sử dụng jQuerythay vì $, điều này giúp tôi hiểu được một chút, nhưng bây giờ tôi có được SecurityError: The operation is insecure. Con trỏ nào không?
mc0e

0

Tôi đã điều chỉnh câu trả lời được bình chọn hàng đầu dưới dạng bookmarklet kéo dài.

Chỉ cần truy cập trang này và kéo nút "Chạy mã jQuery" vào thanh dấu trang của bạn.


1
Đưa ra một lỗi: Lỗi: Cú phápError: chuỗi ký tự không hoàn chỉnh
Barney

@Barney: ý anh là, bạn nên sao chép câu trả lời ở đó và tạo một đoạn trích từ đó. đó không phải là câu trả lời, nhưng tôi đề nghị làm cho nó một nhận xét thay vì một câu trả lời
Mo Hrad A

0

Có một plugin firefox lưu toàn bộ HTML, CSS, v.v. nhưng tôi chưa thấy một nào lưu được một phần.

Tôi nhớ IE 5.5 có những gì bạn đang tìm kiếm mặc dù;)


Giáo sư! Chúng tôi không thể tìm thấy trang đó.
Hamza Zafeer

0

Tôi đã đi qua tất cả các công cụ được đề cập như câu trả lời ở đây. Nhưng họ đưa ra CSS CSS bẩn, lặp đi lặp lại với khuôn mặt đẹp mà bạn đang nhìn chằm chằm. Họ không cung cấp cho bạn JS.

Những gì tôi làm:

  1. Đầu tiên tôi lọc quảng cáo không yêu cầu trên trang
  2. Sau đó, lưu trang web hoàn chỉnh cùng với các tài nguyên liên kết.
  3. Xóa HTML, CSS và JS không cần thiết
  4. giữ liên kết tài nguyên từng cái một cách cẩn thận.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.