Інструменти для вибіркового копіювання HTML + CSS + JS з існуючих сайтів [закрито]


403

Як і більшість веб-розробників, я час від часу люблю зазирнути до джерел веб-сайтів, щоб побачити, як будується їх розмітка. Такі інструменти, як Firebug та Chrome Developer Tools полегшують перевірку коду, але якщо я хочу скопіювати ізольований розділ і пограти з ним локально, було б болю скопіювати всі окремі елементи та пов'язані з ними css. І, напевно, так само багато роботи для збереження всього джерела та вирізання непов'язаного коду.

Було б чудово, якби я міг клацнути правою кнопкою миші вузол у Firebug і мати параметр "Зберегти HTML + CSS для цього вузла". Чи існує такий інструмент? Чи можна розширити Firebug або Chrome Developer Tools, щоб додати цю функцію?


4
Просто хотів додати (не інструмент, як ви описуєте, щоб не робити відповіді), якщо ви використовуєте хром, ви можете вибрати елемент і подивитися "Обчислений стиль" праворуч у розділі css. Ви зможете скопіювати та вставити весь список у стиль. Це додатковий крок від потрібного інструменту, але дає вам потрібний CSS.
riv_rec

1
Не повна відповідь на ваше запитання, але F2 у інструментах для розробників Chrome на вкладці "Елементи" відкриє вибраний елемент DOM та піддірева для вбудованого редагування (та копіювання, якщо потрібно).
10гіст

Одне дуже цікаве розширення хрому - "Зберегти всі ресурси". Встановіть його та перейдіть до пункту «Захист ресурсів» на вкладці «Інструмент Chrome Dev» та завантажте його!
димерос

Відповіді:


580

SnappySnippet

Нарешті я знайшов якийсь час для створення цього інструменту. Ви можете встановити SnappySnippet від Github. Це дозволяє легко витягнути HTML + CSS з вказаного (останнього перевіреного) вузла DOM. Крім того, ви можете відправити свій код прямо на CodePen або JSFiddle. Насолоджуйтесь!

Розширення SnappySnippet Chrome

Інші особливості

  • очищає HTML (видалення непотрібних атрибутів, виправлення відступу)
  • оптимізує CSS, щоб зробити його читабельним
  • повністю настроюється (усі фільтри можна вимкнути)
  • роботи з ::beforeі ::afterпсевдо-елементи
  • приємний інтерфейс завдяки проектам Bootstrap & Flat-UI

Код

SnappySnippet є відкритим кодом, і ви можете знайти код на GitHub .

Впровадження

Оскільки я багато чого навчився, роблячи це, я вирішив поділитися деякими проблемами, які я пережив, і своїми рішеннями щодо них, можливо, комусь це стане цікавим.

Перша спроба - getMatchedCSSRules ()

Спочатку я спробував отримати оригінальні правила CSS (що надходять із файлів CSS на веб-сайті). Досить дивно, це дуже просто завдякиwindow.getMatchedCSSRules() , однак, це не вийшло добре. Проблема полягала в тому, що ми приймали лише частину селекторів HTML та CSS, які відповідали контексту всього документа, які вже не відповідали контексту фрагмента HTML. Оскільки розбір та модифікація селекторів не здавалася гарною ідеєю, я відмовився від цієї спроби.

Друга спроба - getComputedStyle ()

Тоді я почав із чогось, що @CollectiveCognition запропонував - getComputedStyle(). Однак мені дуже хотілося відокремити CSS-форму HTML, а не вкладати всі стилі.

Проблема 1 - відділення CSS від HTML

Рішення тут було не дуже красивим, але досить простим. Я призначив ідентифікатори всім вузлам вибраного піддерева і використовував цей ідентифікатор для створення відповідних правил CSS.

Завдання 2 - видалення властивостей із значеннями за замовчуванням

Присвоєння ідентифікаторів вузлам добре працювало, проте я з’ясував, що кожне моє правило CSS має ~ 300 властивостей, що робить весь CSS нечитабельним.
Виявляється, що getComputedStyle()повертає всі можливі властивості і значення CSS, обчислені для даного елемента. Деякі з них порожні, деякі мали значення за замовчуванням для браузера. Щоб видалити значення за замовчуванням, я мав спочатку отримати їх із браузера (і кожен тег має різні значення за замовчуванням). Рішенням було порівняння стилів елемента, що надходить з веб-сайту, з тим самим елементом, вставленим у порожній <iframe>. Логіка тут полягала в тому, що в порожньому немає аркушів стилів <iframe>, тому кожен доданий до мене елемент мав лише стилі браузера за замовчуванням. Таким чином я зміг позбутися більшості властивостей, які були незначними.

Завдання 3 - збереження лише скорочувальних властивостей

Наступне, що я помітив, - це те, що властивості, що мають еквівалент скорочень, надмірно роздруковуються (наприклад, там border: solid black 1pxі тоді border-color: black;, і т. border-width: 1pxД.).
Щоб вирішити це, я просто створив список властивостей, що мають скорочені еквіваленти, і відфільтрував їх з результатів.

Проблема 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) . Більш того, у мене є непотрібний додатковий видалення атрибутів ( style, і data-ng-repeatт.д.).

Проблема 7 - фільтри, що порушують CSS

Оскільки є ймовірність, що за певних обставин згадані вище фільтри можуть порушити CSS у фрагменті, я зробив усі вони необов’язковими. Ви можете відключити їх у меню " Налаштування" .


@KonradDzwinel, я шукаю спосіб зробити це програмно всередині сторінки (Для друку певного піддерева DOM просто скопіюйте його в нове вікно та print()). Наскільки важко було б (для вас або для когось, хто шукає роздрібнити ваш репо), щоб зробити це лише в JS як функцію дзвінка?
Hashbrown

@Hashbrown Надішліть мені пошту, і ми можемо поговорити докладно - я думаю, це буде досить просто.
Конрад Дзвінель

@KonradDzwinel дякую тобі за зусилля, але що робити, якщо я хочу отримати елемент вузла з функцією php 'file_get_contents ($ url)', чи є якесь рішення, ось мій пост: stackoverflow.com/questions/21419857/ …
Yassine edouiri

Чудова робота! але чи можна включити js-код, який діє на елемент?
t31321

1
@KonradDzwinel хтось мене вже побив: github.com/kdzwinel/SnappySnippet/isissue/37 .
David Keaveny

52

Спочатку я задав це питання, шукав рішення для Chrome (або FireFox), але натрапив на цю функцію в інструментах для розробників Internet Explorer. В основному те, що я шукаю (за винятком javascript)

Елемент джерела зі стилем

Результат:

Джерело елемента з результатом стилю


5
IE11 також працює. Але параметр доступний правою кнопкою миші безпосередньо на елементі.
Родольфо Хорхе Немер Ногейра

15
Ух, нарешті, приклад, коли IE devtools є вищим!
dmnd

7
Найкраще рішення, яке я спробував порівняти з усіма переліченими на цій сторінці. Згенерований CSS + HTML є надзвичайно чистим, зберігаючи оригінальні імена css, тобто HTML-код є таким же, як і оригінал.
xoofx

Святе лайно, яке дивовижно. Може підтвердити висновки @xoofx про те, що розмітка HTML залишається такою ж, але хотіла прокоментувати далі, що вона також виводить елементи обгортки батьків скелета, необхідні для дійсного відповідності стилю.
Данило Соколовський

Використовували це. Не вдалося правильно виконати фрагмент роботи (складні html та css). Я не можу повірити, що це насправді спрацювало. І так, щоб люди знали, я не бачив цю функцію в краєвому просто досліднику.
Ватсон

51

Веб-браузери (не впевнені в FireBug) дозволяють легко скопіювати HTML елемента, так що це одна частина процесу.

Якщо запустити це (у консолі javascript) перед копіюванням HTML для елемента, перемістять усі обчислювані стилі для вказаного батьківського елемента, а також усіх дочірніх елементів, в атрибут стилю inline, який потім буде доступний як частина 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);

}

Це тотальний злом, і у вас буде багато "сміттєвих" атрибутів css, щоб пробиратися, але, принаймні, слід розпочати.


3
Чудова відповідь, але ... не пов'язана з реальною відповіддю, що з синтаксисом for ... циклу? Він читається як заплутаний для мене.
Стів Кемпбелл

1
Це чудово, просто не вистачає кореневого елемента. Додайте також це: el.setAttribute ("стиль", window.getComputedStyle (el) .cssText);
Karman Kertesz

в хромованій консолі .querySelector повернув для мене нульове значення. Тому змініть його на наступне і воно спрацювало: var el = document.getElementById ("# someid"); el.setAttribute ("стиль", window.getComputedStyle (el) .cssText); var els = el.getElementsByTagName ("*"); для (var i = -1, l = els.length; ++ i <l;) {els [i] .setAttribute ("стиль", window.getComputedStyle (els [i]). cssText); }
Віктор Танго

30

Я створив цей інструмент років тому з тією ж метою:
http://www.betterprogramming.com/htmlclipper.html

Ви можете використовувати та вдосконалювати його.


Це саме те, що мені зараз потрібно. Велике спасибі ... думаючи про це рішення, доступне 4 роки тому ...
fro_oo

25

Це можна зробити за допомогою Firebug Plugin, який називається записками

Ви можете перевірити опцію Javascript у налаштуваннях

введіть тут опис зображення

Редагувати:

Це також може допомогти

Firequark - це розширення для Firebug для полегшення процесу вискоблювання екрана HTML. Firequark автоматично витягує селектор css для одного або декількох html-вузлів із веб-сторінки за допомогою Firebug (плагін веб-розробки для Firefox). Створений селектор css може бути поданий як вхід до html-екрану скребків, таких як Scrapi, для отримання інформації. Firequark створений для розблокування потужності селектора css для використання html-екрану.


Записка виглядає чудово - на жаль, і остання версія (1.4.5), і попередня, рекомендована в оглядах (1.4.3), для мене не працюватимуть на OSX / FF3.6.1. У когось це працює?
петеорпетер

Я б хотів, щоб я міг точніше вибрати вузол для збереження, але це спрацювало досить добре
kenwarner

1
Це якось корисно, але не вирішило моєї потреби перенести елемент сторінки з необхідним css на іншу сторінку. Записка записує всі сторінки css, незалежно від того, потрібна вона чи ні для вибраної частини сторінки, і вона не робить переписування css, що допомогло б уникнути стикання стилів з css іншої сторінки.
mc0e

13

divclip - це оновлена ​​версія htmlclipper Florentin Sardan

із сучасними вдосконаленнями: ES5, HTML5, CSS-діапазон ...

ви можете програмно витягти стилізований div з:

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

Насолоджуйтесь.


чудовий! працює як шарм! Я зробив деякі зміни, щоб він міг просто працювати в хромі. просто видаліть залежність "експорту" та "вимагати" та скопіюйте їх у хромований фрагмент. тоді можна в консолі, введіть copy(divclip.bySel('.topbar'))яку буде скопіювати оброблений вихід у буфер обміну! ;)
кен

помилка: shellprod.msocdn.com/16.00.1692.002/en-US/JSC/O365ShellG2Plus.js:21 Не вдалося виконати "postMessage" у "DOMWindow": цільове джерело надано (" portal.office.com" ) не відповідає походження вікна одержувача ('null').
Слава

10

Плагіни не потрібні. Це можна зробити дуже просто за допомогою інструментів для початкових розробників Internet Explorer 11 лише одним клацанням миші, дуже чистим. Просто праворуч на елемент та огляньте цей елемент, клацніть правою кнопкою миші на якомусь блоці та оберіть "Скопіювати елемент зі стилів". Ви можете побачити це на зображенні нижче.

Це забезпечує код css дуже чистим, як

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

Нічого, це прекрасно працювало в Microsoft Edge. Спробував htmlclipper та snappysnippet, але виникли проблеми із збереженням чутливості елементів, які я намагаюся скопіювати.
Метт

це дивовижно, працює чудово.
snit80

5

Нещодавно я створив хромоване розширення "eXtract Snippet" для копіювання перевіреного елемента, html та лише відповідних запитів css та медіа зі сторінки. Зауважте, що це дасть вам фактичну відповідну CSS

https://chrome.google.com/webstore/detail/extract-snippet/bfcjfegkgdoomgmofhcidoiampnpbdao?hl=uk


Мені подобається, як це зберігає всіх селекторів, як в оригіналі.
хаджамі

1
як це порівнюється з хроматичним розширенням фрагменту хрому?
Патоші パ ト シ

3

Інструмент з єдиним рішенням для цього я не знаю, але ви можете використовувати Firebug і розширення Web Developer .

Використовуйте Firebug, щоб скопіювати потрібний розділ HTML (Перевірити елемент) та Веб-розробник, щоб побачити, який css асоціюється з елементом (Виклик веб-розробника "Переглянути інформацію про стиль" - він працює як Firebug "Перевірити елемент", але замість того, щоб показувати html розмітка, вона показує пов'язаний CSS з цією розміткою).

Це не зовсім те , що ви хочете (одним клацанням на все), але це досить близько і принаймні інтуїтивно зрозуміло.

Результат "Переглянути інформацію про стиль" від розширення веб-розробників


Це я роблю, але це включає вручну копіювання CSS для кожного елемента. Я думаю, що ОП хоче в ідеалі - це те, що може скопіювати стилі CSS, що впливають на елемент та всі вкладені елементи, - копіюючи їх за один раз, як ви робите для HTML.
Мухд

3

Мені також потрібна ця функція на Firebug! До цього часу іншим підходом є використання цього онлайн-сервісу для видалення класів та перетворення CSS в стилі вбудованого.


3

http://clipboardjs.com робить це і цілком добре. Хоча ваше сподівання, що скопійована версія буде точно такою, як в оригіналі, щоб ви могли грати і вчитися з нею, може бути нереальним.


2

Просто скопіюйте потрібну частину з веб-сторінки та вставте її в редактор wysiwyg. Перевірте джерело html, натиснувши кнопку "джерело" на панелі інструментів редактора.

Я знайшов цей найпростіший спосіб, коли працював на сайті Drupal. Я використовую 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;
}
});

використання:$("#login_wrapper").getStyles()


Для моєї потреби це виглядає досить перспективно, оскільки дозволяє уникнути обмежень getComputedStyle. Я просто занадто багато noob у JavaScript, щоб бути впевненим, як ним користуватися, щоб отримати фактичний текст css.
mc0e

Я змінив використання, щоб використовувати jQueryзамість $, що трохи змінює мене, але тепер я отримую SecurityError: The operation is insecure. будь-які вказівки?
mc0e

0

Я адаптував найкращу відповідь, що проголосується, як драгуючу закладку.

Просто перейдіть на цю сторінку та перетягніть кнопку «Запустити код jQuery» на панель закладок.


1
Помилка: Помилка: SyntaxError: untermined string literal
Barney

@Barney: він означає, що ти повинен скопіювати відповідь і зробити фрагмент із цього. це не відповідь, але я пропоную зробити коментар замість відповіді
Мо Град

0

Є плагін Firefox який зберігає HTML, CSS всієї сторінки тощо. Але я не бачив жодного, який би частково зберігав.

Я пам'ятаю, що IE 5.5 мав те, що ти шукав;)


На жаль! Ми не можемо знайти цю сторінку.
Hamza Zafeer

0

Я переглянув усі інструменти, згадані як відповідь тут. Але вони надають повторний, брудний HTML CSS з гарним обличчям, на яке ви дивилися. Вони не дають вам JS.

Що я роблю:

  1. Спочатку я фільтрую рекламу, яка не потрібна на сторінці
  2. Потім збережіть повну веб-сторінку разом із посиланнями на ресурси.
  3. Видаліть непотрібні HTML, CSS та JS
  4. продовжуйте обережно відключати ресурси один за одним.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.