java html jsoup html-entities

java - Jsoup.clean sin agregar entidades html



html-entities (7)

Analice el HTML como un documento, luego use un limpiador para limpiar el documento y generar otro, obtenga los ajustes de salida del documento y configure el juego de caracteres apropiado y el modo de escape a xhtml, luego transforme el documento en una cadena. No probado, pero debería funcionar.

Estoy limpiando 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())

rendimientos

"hello &aring; world"

pero me gustaría

"hello å world"

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


La respuesta aceptada es usar Jsoup.parse que parece más pesado que lo que está pasando en Jsoup.clean después de una rápida mirada a la fuente.

Copié el código fuente de Jsoup.clean(...) y agregué la línea para configurar el modo de escape. Esto debería evitar algunos pasos innecesarios realizados por el método de análisis, ya que no tiene que analizar un documento html completo, sino simplemente 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(); }


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

// Clean html Jsoup.clean(someInput, "yourBaseUriOrEmpty", Whitelist.simpleText(), new OutputSettings().escapeMode(EscapeMode.xhtml))


Manera simple:

EscapeMode em = EscapeMode.xhtml; em.getMap().clear(); doc.outputSettings().escapeMode(em);

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


Puede configurar el modo de escape de Jsoup: el uso de 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();


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


Ya hay solicitudes de características en el sitio web de Jsoup. Puede ampliar el código fuente usted mismo agregando un nuevo Mapa vacío y un nuevo tipo de escape. Si no quieres hacer esto, puedes 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; }