Jsoup.limpiar sin añadir entidades html


Estoy limpiando algo de texto de etiquetas HTML no deseadas (como <script>) usando

String clean = Jsoup.clean(someInput, Whitelist.basicWithImages());

El problema es que reemplaza por ejemplo å con &aring; (lo que me causa problemas ya que no es "xml puro").

Por ejemplo

Jsoup.clean("hello å <script></script> world", Whitelist.basicWithImages())

Rinde

"hello &aring;  world"

, Pero me gustaría

"hello å  world"

Hay una manera sencilla de lograr esto? (Es decir, más simple que convertir &aring; de nuevo a å en el resultado.)

Author: Charles, 2011-12-30

7 answers

Puede configurar el modo de escape de Jsoup: Usando EscapeMode.xhtml le dará salida sin entidades.

Aquí hay un fragmento completo que acepta str como entrada, y lo limpia usando Whitelist.simpleText():

// Parse str into a Document
Document doc = Jsoup.parse(str);

// Clean the document.
doc = new Cleaner(Whitelist.simpleText()).clean(doc);

// Adjust escape mode
doc.outputSettings().escapeMode(EscapeMode.xhtml);

// Get back the string of the body.
str = doc.body().html();
 32
Author: bmoc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-11 13:14:42

Ya hay solicitudes de características en el sitio web de Jsoup. Puede ampliar el código fuente usted mismo añadiendo un nuevo mapa vacío y un nuevo tipo de escape. Si no desea hacer esto, puede usar StringEscapeUtils de apache commons.

public static String getTextOnlyFromHtmlText(String htmlText){
    Document doc = Jsoup.parse( htmlText );
    doc.outputSettings().charset("UTF-8");
    htmlText = Jsoup.clean( doc.body().html(), Whitelist.simpleText() );
    htmlText = StringEscapeUtils.unescapeHtml(htmlText);
    return htmlText;
}
 10
Author: Frank Szilinski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-16 15:08:12

La respuesta de & bmoc está funcionando bien, pero podría usar una solución más corta:

// Clean html
Jsoup.clean(someInput, "yourBaseUriOrEmpty", Whitelist.simpleText(), new OutputSettings().escapeMode(EscapeMode.xhtml))
 3
Author: ersefuril,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-24 08:45:49

Una forma más sencilla de hacer esto es

// clean the html
String output = Jsoup.clean(html, Whitelist.basicWithImages());

// Parse string into a document
Document doc = Jsoup.parse(output);

// Adjust escape mode
doc.outputSettings().escapeMode(EscapeMode.xhtml);

// Get back the string
System.out.println(doc.body().html());

He probado esto y funciona

 2
Author: Girish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-06 06:47:11

La respuesta aceptada es usar Jsoup.parse que parece más pesado que lo que está sucediendo en Jsoup.clean después de un rápido vistazo a la fuente.

Copié el código fuente de Jsoup.clean(...) y agregué la línea para establecer el modo de escape. Esto debería evitar algunos pasos innecesarios realizados por el método parse porque no tiene que analizar un documento html completo, sino solo manejar un fragmento.

private String clean(String html, Whitelist whitelist) {
    Document dirty = Jsoup.parseBodyFragment(html, "");
    Cleaner cleaner = new Cleaner(whitelist);
    Document clean = cleaner.clean(dirty);
    clean.outputSettings().escapeMode(EscapeMode.xhtml);
    return clean.body().html();
}
 2
Author: kapex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-03 12:28:31

Analice el HTML como un documento, luego use un Limpiador para limpiar el documento y generar otro, obtenga las configuraciones de salida del documento y establezca el conjunto de caracteres apropiado y el modo de escape en xhtml, luego transforme el documento en una cadena. No probado, pero debería funcionar.

 0
Author: JB Nizet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-30 19:20:01

Manera simple:

EscapeMode em = EscapeMode.xhtml;
em.getMap().clear();

doc.outputSettings().escapeMode(em);

Esto eliminará TODAS las entidades html, incluidas estas: ', ", & ,. El modo EscapeMode .xhtml permite estas entidades.

 0
Author: Diego Queres,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-29 20:28:44