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 å
(lo que me causa problemas, ya que no es "xml puro").
Por ejemplo
Jsoup.clean("hello å <script></script> world", Whitelist.basicWithImages())
rendimientos
"hello å world"
pero me gustaría
"hello å world"
¿Hay una manera sencilla de lograr esto? (Es decir, más sencillo que convertir å
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;
}