Strumenti per copiare in modo selettivo HTML + CSS + JS da siti esistenti [chiuso]


403

Come la maggior parte degli sviluppatori web, a volte mi piace guardare la fonte dei siti Web per vedere come è costruito il loro markup. Strumenti come Firebug e Chrome Developer Tools facilitano l'ispezione del codice, ma se voglio copiare una sezione isolata e giocarci intorno localmente, sarebbe un problema copiare tutti i singoli elementi e i loro CSS associati. E probabilmente altrettanto lavoro per salvare l'intera fonte e tagliare il codice non correlato.

Sarebbe bello se potessi fare clic con il pulsante destro del mouse su un nodo in Firebug e avere un'opzione "Salva HTML + CSS per questo nodo". Esiste un tale strumento? È possibile estendere gli strumenti per sviluppatori Firebug o Chrome per aggiungere questa funzione?


4
Volevo solo aggiungere (non uno strumento come descrivi, quindi non dare una risposta), se usi chrome puoi selezionare un elemento e guardare lo "Stile calcolato" sulla destra nella sezione CSS. Saresti in grado di copiare e incollare l'intero elenco in uno stile. È un ulteriore passaggio da uno strumento che desideri, ma ti dà il css che stai cercando.
riv_rec,

1
Non una risposta completa alla tua domanda, ma F2 negli strumenti di sviluppo di Chrome nella scheda "Elementi" aprirà l'elemento DOM selezionato e la sottostruttura per la modifica in linea (e la copia se lo desideri).
10

Un'estensione molto interessante di Chrome è il "Salva tutte le risorse". Installalo e poi vai a "Risorse risparmiate" della scheda Chrome Dev Tool e scaricalo!
dimeros,

Risposte:


580

SnappySnippet

Finalmente ho trovato del tempo per creare questo strumento. Puoi installare SnappySnippet da Github. Consente una facile estrazione HTML + CSS dal nodo DOM specificato (ultimo controllo). Inoltre, è possibile inviare il codice direttamente a CodePen o JSFiddle. Godere!

Estensione SnappySnippet per Chrome

Altre caratteristiche

  • pulisce HTML (rimuove gli attributi non necessari, corregge il rientro)
  • ottimizza CSS per renderlo leggibile
  • completamente configurabile (tutti i filtri possono essere disattivati)
  • funziona con ::beforee ::afterpseudo-elementi
  • bella interfaccia utente grazie ai progetti Bootstrap e Flat-UI

Codice

SnappySnippet è open source e puoi trovare il codice su GitHub .

Implementazione

Dato che ho imparato parecchio mentre lo facevo, ho deciso di condividere alcuni dei problemi che ho riscontrato e le mie soluzioni, forse qualcuno lo troverà interessante.

Primo tentativo: getMatchedCSSRules ()

All'inizio ho provato a recuperare le regole CSS originali (provenienti dai file CSS sul sito Web). Abbastanza sorprendentemente, questo è molto semplice grazie window.getMatchedCSSRules(), tuttavia, non ha funzionato bene. Il problema era che stavamo prendendo solo una parte dei selettori HTML e CSS che corrispondevano nel contesto dell'intero documento, che non corrispondevano più nel contesto di uno snippet HTML. Poiché l'analisi e la modifica dei selettori non sembravano una buona idea, ho rinunciato a questo tentativo.

Secondo tentativo - getComputedStyle ()

Quindi, sono partito da qualcosa che suggeriva @CollectiveCognition - getComputedStyle(). Tuttavia, volevo davvero separare i CSS dall'HTML invece di includere tutti gli stili.

Problema 1: separazione dei CSS dall'HTML

La soluzione qui non è stata molto bella ma abbastanza semplice. Ho assegnato gli ID a tutti i nodi nella sottostruttura selezionata e ho usato quell'ID per creare le regole CSS appropriate.

Problema 2: rimozione di proprietà con valori predefiniti

L'assegnazione degli ID ai nodi ha funzionato bene, tuttavia ho scoperto che ciascuna delle mie regole CSS ha ~ 300 proprietà che rendono illeggibile l'intero CSS.
Risulta che getComputedStyle()restituisce tutte le possibili proprietà CSS e valori calcolati per l'elemento dato. Alcuni di essi erano vuoti, altri avevano valori predefiniti del browser. Per rimuovere i valori predefiniti ho dovuto prima scaricarli dal browser (e ogni tag ha valori predefiniti diversi). La soluzione è stata quella di confrontare gli stili dell'elemento proveniente dal sito Web con lo stesso elemento inserito in uno spazio vuoto <iframe>. La logica qui era che non ci sono fogli di stile in un vuoto<iframe> , quindi ogni elemento che ho aggiunto lì aveva solo stili di browser predefiniti. In questo modo sono stato in grado di sbarazzarmi della maggior parte delle proprietà che erano insignificanti.

Problema 3: mantenere solo le proprietà stenografiche

La prossima cosa che ho notato è che le proprietà con equivalente stenografia sono state inutilmente stampate (ad esempio, c'era border: solid black 1pxe poi border-color: black;, e così via border-width: 1px).
Per risolvere questo, ho semplicemente creato un elenco di proprietà che hanno equivalenti di stenografia e le hanno filtrate dai risultati.

Problema 4 - rimozione delle proprietà con prefisso

Il numero di immobili a ogni regola è stata inferiore in modo significativo dopo l'operazione precedente, ma ho scoperto che ho davanzale avuto un sacco di -webkit-proprietà con il prefisso che non ho mai sentito di ( -webkit-app-region? -webkit-text-emphasis-position?).
Mi chiedevo se avrei dovuto mantenere una di queste proprietà perché alcune sembravano utili ( -webkit-transform-origin, -webkit-perspective-originecc.). Non ho capito come verificarlo, però, e poiché sapevo che la maggior parte delle volte queste proprietà sono solo spazzatura, ho deciso di rimuoverle tutte.

Problema 5: combinazione delle stesse regole CSS

Il problema successivo che ho notato è che le stesse regole CSS vengono ripetute più e più volte (ad es. Per ognuna <li>con gli stessi identici stili c'era la stessa regola nell'output CSS creato).
Si trattava solo di confrontare le regole tra loro e di combinarle esattamente con lo stesso insieme di proprietà e valori. Di conseguenza, invece di #LI_1{...}, #LI_2{...}me #LI_1, #LI_2 {...}.

Problema 6: ripulire e correggere il rientro dell'HTML

Dato che ero soddisfatto del risultato, sono passato all'HTML. Sembrava un disastro, soprattutto perché la outerHTMLproprietà lo mantiene formattato esattamente come è stato restituito dal server.
L'unica cosa che è stata presa dal codice HTML outerHTMLera una semplice riformattazione del codice. Dal momento che è qualcosa disponibile in ogni IDE, ero sicuro che esiste una libreria JavaScript che fa esattamente questo. E si scopre che avevo ragione (jquery-clean) . Inoltre, ho ulteriori extra di rimozione degli attributi ( style, data-ng-repeatecc.).

Problema 7: filtri che interrompono i CSS

Poiché esiste la possibilità che in alcuni casi i filtri sopra menzionati possano spezzare i CSS nello snippet, li ho resi opzionali. Puoi disabilitarli dal menu Impostazioni .


@KonradDzwinel, sto cercando un modo per farlo a livello di codice all'interno di una pagina (per stampare una sottostruttura DOM specifica, basta copiarla in una nuova finestra e print()). Quanto sarebbe difficile (per te o per qualcuno cercare di fare il fork del tuo repository) per renderlo solo in JS come una funzione richiamabile?
Hashbrown,

@Hashbrown Scrivimi e possiamo parlare dei dettagli - penso che sarà abbastanza semplice.
Konrad Dzwinel,

@KonradDzwinel grazie mille per lo sforzo, ma cosa succede se voglio ottenere l'elemento del nodo con la funzione php 'file_get_contents ($ url)', c'è qualche soluzione, ecco il mio post: stackoverflow.com/questions/21419857/ ...
Yassine edouiri,

Ottimo lavoro! ma è possibile includere il codice js che agisce sull'elemento?
1431,

1
@KonradDzwinel qualcuno mi ha già battuto: github.com/kdzwinel/SnappySnippet/issues/37 .
David Keaveny,

52

Inizialmente avevo posto questa domanda che cercavo una soluzione Chrome (o FireFox), ma mi sono imbattuto in questa funzione negli strumenti di sviluppo di Internet Explorer. Praticamente quello che sto cercando (tranne per il javascript)

Fonte elemento con stile

Risultato:

Origine elemento con risultato Stile


5
Anche IE11 funziona. Ma l'opzione è accessibile facendo clic con il tasto destro direttamente sull'elemento.
Rodolfo Jorge Nemer Nogueira,

15
Caspita, finalmente un esempio in cui gli sviluppatori di IE sono superiori!
dmnd

7
La migliore soluzione che ho provato confronta con tutte le altre elencate in questa pagina. Il CSS + HTML generato è super pulito mantenendo i nomi CSS originali, il che significa che l'html è lo stesso dell'originale.
xoofx,

Merda santa che è eccezionale. Può confermare le scoperte di @xoofx secondo cui il markup HTML rimane lo stesso, ma ha voluto commentare ulteriormente che produce anche elementi scheletrati di wrapping parent necessari per abbinare veramente lo stile.
Daniel Sokolowski l'

Usato questo. Impossibile far funzionare correttamente lo snippet snappy (html e css complessi). Non posso credere che abbia funzionato davvero. E proprio così la gente lo sa, non ho visto questa funzione in Edge Explorer.
Watson,

51

I browser Webkit (non sono sicuri di FireBug) consentono di copiare facilmente l'HTML di un elemento, quindi questa è una parte del processo.

L'esecuzione di questo (nella console javascript) prima di copiare l'HTML per un elemento sposta tutti gli stili calcolati per l'elemento genitore fornito, nonché tutti gli elementi figlio, nell'attributo di stile inline che sarà quindi disponibile come parte dell'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);

}

È un hack totale e avrai un sacco di attributi CSS "junk" da superare, ma almeno dovresti iniziare.


3
Ottima risposta, ma ... non correlata alla risposta effettiva, qual è la sintassi del ciclo for ...? Mi sembra offuscato.
Steve Campbell,

1
Questo è fantastico, manca solo l'elemento radice. Aggiungi anche questo: el.setAttribute ("style", window.getComputedStyle (el) .cssText);
Karman Kertesz,

nella console di Chrome, .querySelector ha restituito null per me. Quindi cambiarlo nel modo seguente e ha funzionato: 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,


25

Questo può essere fatto dal plugin Firebug chiamato scrapbook

È possibile selezionare l'opzione Javascript nell'impostazione

inserisci qui la descrizione dell'immagine

Modificare:

Questo può anche aiutare

Firequark è un'estensione di Firebug per facilitare il processo di scraping dello schermo HTML. Firequark estrae automaticamente il selettore css per uno o più nodi html da una pagina Web usando Firebug (un plugin di sviluppo web per Firefox). Il selettore CSS generato può essere fornito come input per i raschiatori di schermate html come Scrapi per estrarre informazioni. Firequark è costruito per liberare la potenza del selettore css per l'uso dello scraping dello schermo html.


Scrapbook ha un bell'aspetto: sfortunatamente sia l'ultima versione (1.4.5) che una precedente raccomandata nelle recensioni (1.4.3) non funzionerebbero su OSX / FF3.6.1. Qualcuno ha questo lavoro?
Peteorpeter,

vorrei poter selezionare più precisamente un nodo da salvare, ma questo ha funzionato abbastanza bene
kenwarner

1
Questo è un po 'utile, ma non ha risolto il mio bisogno di spostare un elemento di pagina con i CSS richiesti in un'altra pagina. Scrapbook copia tutte le pagine CSS, se è necessario o meno per la parte selezionata della pagina, e non esegue alcuna riscrittura dei CSS che aiuterebbe a evitare che gli stili si scontrino con i CSS di un'altra pagina.
mc0e,

13

divclip è una versione aggiornata di htmlclipper di Florentin Sardan

con miglioramenti moderni: ES5, HTML5, CSS con ambito ...

puoi estrarre programmaticamente un div stilizzato con:

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

Godere.


grande! funziona come un fascino! ho apportato alcune modifiche in modo che possa funzionare solo in Chrome. basta rimuovere la dipendenza "esporta" e "richiedere" e copiarli nello snippet di Chrome. quindi puoi nella console, digitare copy(divclip.bySel('.topbar'))che copierà negli appunti l'output elaborato! ;)
ken,

presenta un errore: shellprod.msocdn.com/16.00.1692.002/en-US/JSC/O365ShellG2Plus.js:21 Impossibile eseguire "postMessage" su "DOMWindow": l'origine di destinazione fornita (" portal.office.com" ) non corrisponde all'origine della finestra del destinatario ('null').
Slava,

10

Non sono necessari plugin. Può essere fatto molto semplicemente con gli strumenti di sviluppo nativi di Internet Explorer 11 con un solo clic, molto pulito. Basta inserire un elemento e ispezionarlo, fare clic con il tasto destro su un blocco e scegliere "Copia elemento con stili". Puoi vederlo nell'immagine qui sotto.

Fornisce il codice CSS molto pulito, come

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

Wow, questo ha funzionato perfettamente in Microsoft Edge. Ho provato htmlclipper e snappysnippet ma ho avuto problemi a conservare la reattività degli elementi che sto cercando di copiare.
Matt

è fantastico, funziona perfettamente.
Snit80

5

Ultimamente ho creato un'estensione Chrome "eXtract Snippet" per copiare l'elemento ispezionato, html e solo le query CSS e multimediali pertinenti da una pagina. Tieni presente che ciò ti darebbe l'effettivo CSS pertinente

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


Mi piace come questo mantiene tutti i selettori come nell'originale.
Hajamie,

1
come si confronta con l'estensione cromata dello snippet snappy?
Patoshi パ ト シ

3

Non sono a conoscenza di uno strumento con un'unica soluzione, ma puoi utilizzare l' estensione Firebug e Web Developer contemporaneamente l' .

Usa Firebug per copiare la sezione html di cui hai bisogno (Inspect Element) e Web Developer per vedere quale css è associato a un elemento (Calling Web Developer "Visualizza informazioni sullo stile" - funziona come "Inspect Element" di Firebug, ma invece di mostrare l'html markup mostra il CSS associato a quel markup).

Non è esattamente quello che vuoi (un clic per tutto), ma è abbastanza vicino e almeno intuitivo.

Risultato "Visualizza informazioni sullo stile" dall'estensione per sviluppatori Web


Questo è quello che faccio, ma comporta la copia manuale del CSS per ogni elemento. Ciò che penso che l'OP voglia idealmente è qualcosa che può copiare gli stili CSS che influenzano un elemento e tutti gli elementi nidificati - copiandolo in una volta come fai per l'HTML.
Muhd,

3

Ho anche bisogno di questa funzione su Firebug! Fino ad allora, un altro approccio consiste nell'utilizzare questo servizio online per rimuovere le classi e convertire i CSS in stili incorporati.


3

http://clipboardjs.com fa questo e abbastanza bene. Sebbene le tue aspettative sulla versione copiata siano esattamente come sull'originale, così puoi giocare e imparare con esso, potrebbe non essere realistico.


2

Basta copiare la parte desiderata dalla pagina Web e incollarla nell'editor wysiwyg. Controlla la fonte html facendo clic sul pulsante "fonte" sulla barra degli strumenti dell'editor.

Ho trovato questo il modo più semplice quando stavo lavorando su un sito Drupal. Uso 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;
}
});

utilizzo:$("#login_wrapper").getStyles()


Per le mie necessità, questo sembra abbastanza promettente, in quanto evita i limiti di getComputedStyle. Sono solo un gran numero di javascript per essere sicuro di come usarlo per ottenere il testo reale del CSS.
mc0e,

Ho cambiato l'utilizzo da utilizzare jQueryinvece di $, il che mi dà un po 'di strada, ma ora ho SecurityError: The operation is insecure. qualche puntatore?
mc0e,

0

Ho adattato la risposta più votata come bookmarklet trascinabile.

Basta visitare questa pagina e trascinare il pulsante "Esegui codice jQuery" sulla barra dei segnalibri.


1
Fornisce un errore: Errore: SintassiErrore: stringa non terminata letterale
Barney

@Barney: vuol dire che dovresti copiare lì la risposta e ricavarne uno snippet. non è la risposta, ma suggerisco di renderlo un commento anziché una risposta
Mo Hrad A

0

C'è un plugin per Firefox che salva l'HTML, i CSS, ecc. Dell'intera pagina, ma non ne ho visto uno che esegua un salvataggio parziale.

Ricordo che IE 5.5 aveva quello che stavi cercando;)


Oops! Non riusciamo a trovare quella pagina.
Hamza Zafeer,

0

Ho esaminato tutti gli strumenti citati come risposta qui. Ma forniscono CSS HTML ripetuti e sporchi con un bel viso su cui stavi fissando. Non ti danno JS.

Quello che faccio:

  1. In primo luogo filtrare gli annunci che non sono richiesti nella pagina
  2. Quindi, salva la pagina Web completa insieme alle risorse di collegamento.
  3. Rimuovi HTML, CSS e JS non necessari
  4. continua a scollegare attentamente le risorse una per una.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.