2012-09-29 12 views
18

una descrizione di quello che ho intenzione di realizzare:Costruire un algoritmo HTML Diff/Patch

  • Ingresso 2 (N non è essenziale) documenti HTML.
  • Standardizza il formato HTML
  • Diff i due documenti: gli stili esterni non sono importanti ma verrà incluso qualsiasi elemento incorporato nel documento.
  • Determina delta al livello dell'elemento HTML Block.

Ampliare l'ultimo punto:

immaginare due pagine dello stesso sito che entrambi condividono una barra laterale con quello che era probabilmente un antenato comune che è stato copia/incollato. Ogni pagina ha alcune modifiche minori alla barra laterale. Il diff rivelerà queste modifiche, quindi posso "salire" sul DOM per trovare il primo elemento di blocco comune condiviso da loro, o semplicemente predefinito su <body>. In questo caso, mi piacerebbe farlo e scoprire che, oh, condividono un comune <div id="sidebar">.

Conosco DaisyDiff e l'applicazione è simile, nel mondo CMS.

Ho anche iniziato a giocare con la libreria di patch di google.

Volevo chiedere a questo tipo di domanda non specifica di sperare eventualmente qualche consiglio o guida che qualcuno possa essere d'aiuto. Attualmente se metti una pistola alla mia testa e dici "CODICE IT", riscrivo DaisyDiff in Python e aggiungo questa logica a livello di blocco. Ma ho pensato che forse c'è un modo migliore e le risposte a Anyone have a diff algorithm for rendered HTML? mi hanno fatto sentire caldo e confuso.

+1

Correlato: http://stackoverflow.com/questions/1576459/generate-pretty-diff-html-in-python. –

+0

Non sono sicuro della vostra esatta applicazione, ma un algoritmo di classificazione DOM viene utilizzato da progetti come http://www.readability.com/ per estrarre il contenuto pertinente. Se vuoi diff solo sul nucleo della pagina, qualcosa del genere potrebbe avere senso –

+0

Mi piacerebbe sentire un aggiornamento su questo progetto; se sei riuscito a trovare quello che stavi cercando e se hai intenzione di aprirlo in qualsiasi momento :) – onassar

risposta

9

Se si dovesse iniziare da zero, un termine di ricerca utile sarebbe "albero diff".

C'è un post bellissimo sul blog here, anche se l'ho appena trovato su google "daisydiff python", quindi scommetto che l'hai già visto. Oltre a tutte le interessanti cose teoriche, menziona l'esistenza di Logilab's xmldiff, una differenza XML open source scritta in Python. Questo potrebbe essere un buon punto di partenza, forse meno corretto rispetto al tentativo di avvolgere o reimplementare DaisyDiff, ma probabilmente è più facile da far funzionare rapidamente.

C'è anche html-tree-diff su PyPI, che ho trovato tramite questo link Quora: http://www.quora.com/Is-there-any-good-Python-implementation-of-a-tree-diff-algorithm

Ci sono alcune cose teorica albero diffing a efficient diff algorithm for trees and Levenshtein distance su cstheory.stackexchange.

BTW, tanto per chiarire, è sono parlando diffing due alberi DOM, ma non necessariamente rendere il diff/merge di nuovo in un particolare formato HTML, giusto? (MODIFICA: destra.) Molte delle domande formulate in modo simile qui stanno davvero chiedendo "come posso colorare linee cancellate rosse e aggiunte linee verdi" o "come posso rendere allineati i paragrafi allineati visivamente", saltando proprio sopra la parte teorica di "come faccio a distinguere due alberi DOM in primo luogo" e la parte pratica di "come posso analizzare l'HTML malformato in un albero DOM ancora prima". :)

+0

Esatto - C'è un sacco di rumore in quest'area di persone che vogliono rendere un diff in HTML nel modo in cui hai descritto. Non mi interessa affatto, non renderò affatto il diff, ma userei invece i delta block-output di output per guidare visualizzazioni più potenti delle differenze tra pagine diverse e versioni della stessa pagina. Apprezzo il tuo contributo, non è come se avessi mai realizzato prima e volevo essere sicuro di non pensarci troppo o di non trovare nulla di ovvio. –

1

So che queste domande sono relative a Python ma si potrebbe dare un'occhiata 3DM - Strumento di fusione e differenziazione a 3 vie XML (implementazione predefinita in java) ma qui è il documento attuale che descrive l'algoritmo utilizzato http://www.cs.hut.fi/~ctl/3dm/thesis.pdf, e qui è il collegamento allo site.

L'inconveniente è che è necessario pulire il documento ed essere in grado di analizzarlo come XML.

1

È possibile iniziare utilizzando beautifulsoup per analizzare entrambi i documenti.

allora avete una scelta:

  • uso prettify di rendere entrambi i documenti come più o meno standardizzato HTML e diff quelli.
  • confrontare il parse trees.

Quest'ultimo consente di ad es. scartare gli elementi che riguardano solo la presentazione, non il contenuto. Il primo è probabilmente più facile.