2011-12-02 14 views
6

Sto cercando un approccio efficiente per estrarre un frammento di HTML da una pagina Web ed eseguire alcune operazioni specifiche su quel frammento HTML.Estrarre e pulire il frammento HTML utilizzando il parser HTML (org.htmlparser)

Le operazioni necessarie sono:

  1. Rimuovere tutti i tag che hanno una classe di "nascosto"
  2. Rimuovere tutti i tag di script
  3. Rimuovere tutti i tag di stile
  4. rimuovere gli attributi tutti gli eventi (a * = "*")
  5. Rimuovere tutti gli attributi di stile

Ho utilizzato HTML Parser (org.htmlparser) per questa attività e sono stato in grado di soddisfare tutti i requisiti, tuttavia, non credo di avere una soluzione elegante. Attualmente sto analizzando la pagina Web con uno CssSelectorNodeFilter (per ottenere il frammento) e quindi analizzando nuovamente il frammento con uno NodeVisitor per eseguire le operazioni di pulizia.

Qualcuno potrebbe suggerire come affrontare questo problema? Preferirei solo analizzare il documento una sola volta ed eseguire tutte le operazioni durante quell'unica analisi.

Grazie in anticipo!

risposta

6

Check out jsoup - dovrebbe gestire tutte le attività necessarie in modo elegante.

[Edit]

Ecco un esempio completo di lavoro per le operazioni necessarie:

// Load and parse the document fragment. 
File f = new File("myfile.html"); // See also Jsoup#parseBodyFragment(s) 
Document doc = Jsoup.parse(f, "UTF-8", "http://example.com"); 

// Remove all script and style elements and those of class "hidden". 
doc.select("script, style, .hidden").remove(); 

// Remove all style and event-handler attributes from all elements. 
Elements all = doc.select("*"); 
for (Element el : all) { 
    for (Attribute attr : el.attributes()) { 
    String attrKey = attr.getKey(); 
    if (attrKey.equals("style") || attrKey.startsWith("on")) { 
     el.removeAttr(attrKey); 
    } 
    } 
} 
// See also - doc.select("*").removeAttr("style"); 

ti consigliamo di assicurarsi che le cose come la sensibilità caso non contano per i nomi degli attributi, ma questa dovrebbe essere la maggioranza di quello che ti serve.

+0

Daremo un'occhiata a jsoup. Se fornisce un quadro migliore per risolvere il mio problema, allora presenterò una risposta che sostiene il suo uso per le mie esigenze. Grazie per il consiglio. –

+0

@KieranHall: vedere la mia risposta aggiornata con un esempio funzionante. – maerics

+0

come ottenere la stringa di restituzione dopo aver rimosso l'attributo? –

Problemi correlati