2011-12-02 8 views
6

Estoy buscando un enfoque eficiente para extraer un fragmento de HTML de una página web y realizar algunas operaciones específicas en ese fragmento de HTML.Extraer y limpiar fragmento de HTML utilizando el analizador HTML (org.htmlparser)

Las operaciones requeridas son:

  1. Retire todas las etiquetas que tienen una clase de "oculto"
  2. quitar todas las etiquetas de secuencia de comandos
  3. Eliminar todas las etiquetas de estilo
  4. Eliminar todos los atributos de evento (en * = "*")
  5. Quitar todos los atributos de estilo

He estado usando HTML Parser (org.htmlparser) para esta tarea y he podido cumplir todos los requisitos, sin embargo, no creo que tenga una solución elegante. Actualmente, estoy analizando la página web con un CssSelectorNodeFilter (para obtener el fragmento) y luego volviendo a analizar ese fragmento con un NodeVisitor para llevar a cabo las operaciones de limpieza.

¿Alguien podría sugerir cómo abordarían este problema? Preferiría analizar solo el documento una vez y realizar todas las operaciones durante ese análisis.

¡Gracias de antemano!

Respuesta

6

Echa un vistazo jsoup - debe manejar todas sus tareas necesarias de una manera elegante.

[Editar]

Aquí está un ejemplo completo de trabajo por sus operaciones requeridas:

// 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"); 

usted querrá asegurarse de que todo como mayúsculas y minúsculas no importan los nombres de atributos, pero esto debería ser la mayoría de lo que necesita.

+0

Echaré un vistazo a jsoup. Si proporciona un mejor marco para resolver mi problema, entonces presentaré una respuesta que defienda su uso para mis requisitos. Gracias por el consejo. –

+0

@KieranHall: vea mi respuesta actualizada con un ejemplo de trabajo. – maerics

+0

cómo obtener cadena de retorno después de eliminar el atributo? –

Cuestiones relacionadas