Reputation: 11946
I created a method to strip some elements from HTML using Jsoup, but Jsoup is not escaping the accented characters like it should.
Here is my code, with a main() to test, so it's self-contained and executable:
public class JsoupWrapper {
public static void main(String[] args) {
String s = "<p style=\"text-align: justify;\">Cet amendement vise à rectifier le montant des annulations sur le programme 181 « Prévention des risques », de la mission « Écologie, développement et mobilités durables », en l’abaissant de 24,2 M€.</p>\n" +
"<p style=\"text-align: justify;\">Cette minoration des annulations est proposée dans le cadre du redéploiement de crédits du programme d’investissements d’avenir (PIA) depuis les actions du PIA portées par l’Agence de l’environnement et de la maîtrise de l’énergie (ADEME), vers l’action « Equipex » portée par l’Agence nationale de la recherche (ANR), pour financer les projets « Microcarb » et « Polar Pod ». Le redéploiement concernera pour l’ADEME l’action « Véhicules et transporteurs du futur », à hauteur de 40 M€ et l’action « Démonstrateurs de la transition énergétique », à hauteur de 10,8 M€. Le soutien aux deux projets « Microcarb » et « Polar Pod » demeure complet, cette modification constituant un simple ajustement qui permet, tout en maintenant le soutien à « Polar Pod » et « Microcarb », de préserver des moyens sur l’action « Véhicules et transporteurs du futur » du PIA en vue de la conclusion des assises de la mobilité.</p>\n" +
"<p style=\"text-align: justify;\">Cet amendement est complété par un amendement miroir sur le programme 172 « Recherches scientifiques et technologiques pluridisciplinaires », de la mission « Recherche et enseignement supérieur ».</p>";
System.out.println(cleanToBeforeRevision(s));
}
public static String cleanToBeforeRevision(String html) {
if (html == null) {
return null;
}
org.jsoup.nodes.Document doc = Jsoup.parse(html);
// This should normally do the trick
doc.outputSettings().prettyPrint(false).escapeMode(Entities.EscapeMode.extended);
Elements toReverts = doc.select("span.ins");
Elements toRestores = doc.select("span.del, span[data-userid], span[data-username]");
toReverts.forEach(Node::remove);
toRestores.forEach(toRestore->{
TextNode text = new TextNode(toRestore.html());
toRestore.replaceWith(text);
});
return doc.body().html();
}
}
The à
, for example, should be replaced by a à
, the é
by a é
, etc. However, that's not the case.
I'm using Jsoup 1.12.1.
Edit: I want everything except the HTML special characters (<, >, "...) to be encoded. Especially acccented characters. The result still needs to be HTML.
Upvotes: 0
Views: 428
Reputation: 364
You can pass your doc string to the escapeHtml4()
or escapeHtml3()
method of StringEscapeUtils
from org.apache.commons.text
to solve your problem:
import org.jsoup.*;
import org.jsoup.nodes.Entities;
import org.apache.commons.text.*;
public class MyClass {
public static void main(String[] args) {
String strHTMLInput = "<p style=\"text-align: justify;\">Cet amendement vise à rectifier le montant des annulations sur le programme 181 « Prévention des risques », de la mission « Écologie, développement et mobilités durables », en l’abaissant de 24,2 M€.</p>\n" +
"<p style=\"text-align: justify;\">Cette minoration des annulations est proposée dans le cadre du redéploiement de crédits du programme d’investissements d’avenir (PIA) depuis les actions du PIA portées par l’Agence de l’environnement et de la maîtrise de l’énergie (ADEME), vers l’action « Equipex » portée par l’Agence nationale de la recherche (ANR), pour financer les projets « Microcarb » et « Polar Pod ». Le redéploiement concernera pour l’ADEME l’action « Véhicules et transporteurs du futur », à hauteur de 40 M€ et l’action « Démonstrateurs de la transition énergétique », à hauteur de 10,8 M€. Le soutien aux deux projets « Microcarb » et « Polar Pod » demeure complet, cette modification constituant un simple ajustement qui permet, tout en maintenant le soutien à « Polar Pod » et « Microcarb », de préserver des moyens sur l’action « Véhicules et transporteurs du futur » du PIA en vue de la conclusion des assises de la mobilité.</p>\n" +
"<p style=\"text-align: justify;\">Cet amendement est complété par un amendement miroir sur le programme 172 « Recherches scientifiques et technologiques pluridisciplinaires », de la mission « Recherche et enseignement supérieur ».</p>";
org.jsoup.nodes.Document doc = Jsoup.parse(strHTMLInput);
// This should normally do the trick
doc.outputSettings().prettyPrint(false).escapeMode(Entities.EscapeMode.extended);
String strEscapeHTML = StringEscapeUtils.escapeHtml3(doc.body().html());
System.out.println("Escaped HTML >>> " + strEscapeHTML);
}
}
Escaped HTML >>> <p style="text-align: justify;">Cet amendement vise à rectifier le montant des annulations sur le programme 181 «&nbsp;Prévention des risques&nbsp;», de la mission «&nbsp;Écologie, développement et mobilités durables&nbsp;», en l’abaissant de 24,2&nbsp;M€.</p>
<p style="text-align: justify;">Cette minoration des annulations est proposée dans le cadre du redéploiement de crédits du programme d’investissements d’avenir (PIA) depuis les actions du PIA portées par l’Agence de l’environnement et de la maîtrise de l’énergie (ADEME), vers l’action «&nbsp;Equipex&nbsp;» portée par l’Agence nationale de la recherche (ANR), pour financer les projets «&nbsp;Microcarb&nbsp;» et «&nbsp;Polar Pod&nbsp;». Le redéploiement concernera pour l’ADEME l’action «&nbsp;Véhicules et transporteurs du futur&nbsp;», à hauteur de 40&nbsp;M€ et l’action «&nbsp;Démonstrateurs de la transition énergétique&nbsp;», à hauteur de 10,8&nbsp;M€. Le soutien aux deux projets «&nbsp;Microcarb&nbsp;» et «&nbsp;Polar Pod&nbsp;» demeure complet, cette modification constituant un simple ajustement qui permet, tout en maintenant le soutien à «&nbsp;Polar Pod&nbsp;» et «&nbsp;Microcarb&nbsp;», de préserver des moyens sur l’action «&nbsp;Véhicules et transporteurs du futur&nbsp;» du PIA en vue de la conclusion des assises de la mobilité.</p>
<p style="text-align: justify;">Cet amendement est complété par un amendement miroir sur le programme 172 «&nbsp;Recherches scientifiques et technologiques pluridisciplinaires&nbsp;», de la mission «&nbsp;Recherche et enseignement supérieur&nbsp;».</p>
Note: You may want to reapply the missing segments from your code.
Since it was requested that html special characters remain unchanged, I devised the following:
import org.jsoup.*;
import org.jsoup.nodes.Entities;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.apache.commons.text.*;
public class MyClass {
public static void main(String[] args) {
String strHTMLInput = "<p style=\"text-align: justify;\">Cet amendement vise à rectifier le montant des annulations sur le programme 181 « Prévention des risques », de la mission « Écologie, développement et mobilités durables », en l’abaissant de 24,2 M€.</p>\n" +
"<p style=\"text-align: justify;\">Cette minoration des annulations est proposée dans le cadre du redéploiement de crédits du programme d’investissements d’avenir (PIA) depuis les actions du PIA portées par l’Agence de l’environnement et de la maîtrise de l’énergie (ADEME), vers l’action « Equipex » portée par l’Agence nationale de la recherche (ANR), pour financer les projets « Microcarb » et « Polar Pod ». Le redéploiement concernera pour l’ADEME l’action « Véhicules et transporteurs du futur », à hauteur de 40 M€ et l’action « Démonstrateurs de la transition énergétique », à hauteur de 10,8 M€. Le soutien aux deux projets « Microcarb » et « Polar Pod » demeure complet, cette modification constituant un simple ajustement qui permet, tout en maintenant le soutien à « Polar Pod » et « Microcarb », de préserver des moyens sur l’action « Véhicules et transporteurs du futur » du PIA en vue de la conclusion des assises de la mobilité.</p>\n" +
"<p style=\"text-align: justify;\">Cet amendement est complété par un amendement miroir sur le programme 172 « Recherches scientifiques et technologiques pluridisciplinaires », de la mission « Recherche et enseignement supérieur ».</p>";
org.jsoup.nodes.Document doc = Jsoup.parse(strHTMLInput);
// This should normally do the trick
doc.outputSettings().prettyPrint(false).escapeMode(null);
String strUnescapeHTML = StringEscapeUtils.unescapeHtml4(doc.body().html());
String strEscapeHTML = StringEscapeUtils.escapeHtml4(strUnescapeHTML);
String unescapeHtml=strEscapeHTML;
Elements elements=doc.body().children();
for(Element element: elements){
element.text(StringEscapeUtils.escapeHtml4(element.text()));
}
System.out.println("\nUnescaped HTML >>> " + strUnescapeHTML);
System.out.println("\nEscaped HTML >>> " + StringEscapeUtils.unescapeXml(doc.body().html()));
}
}
Unescaped HTML >>> <p style="text-align: justify;">Cet amendement vise à rectifier le montant des annulations sur le programme 181 « Prévention des risques », de la mission « Écologie, développement et mobilités durables », en l’abaissant de 24,2 M€.</p>
<p style="text-align: justify;">Cette minoration des annulations est proposée dans le cadre du redéploiement de crédits du programme d’investissements d’avenir (PIA) depuis les actions du PIA portées par l’Agence de l’environnement et de la maîtrise de l’énergie (ADEME), vers l’action « Equipex » portée par l’Agence nationale de la recherche (ANR), pour financer les projets « Microcarb » et « Polar Pod ». Le redéploiement concernera pour l’ADEME l’action « Véhicules et transporteurs du futur », à hauteur de 40 M€ et l’action « Démonstrateurs de la transition énergétique », à hauteur de 10,8 M€. Le soutien aux deux projets « Microcarb » et « Polar Pod » demeure complet, cette modification constituant un simple ajustement qui permet, tout en maintenant le soutien à « Polar Pod » et « Microcarb », de préserver des moyens sur l’action « Véhicules et transporteurs du futur » du PIA en vue de la conclusion des assises de la mobilité.</p>
<p style="text-align: justify;">Cet amendement est complété par un amendement miroir sur le programme 172 « Recherches scientifiques et technologiques pluridisciplinaires », de la mission « Recherche et enseignement supérieur ».</p>
Escaped HTML >>> <p style="text-align: justify;">Cet amendement vise à rectifier le montant des annulations sur le programme 181 « Prévention des risques », de la mission « Écologie, développement et mobilités durables », en l’abaissant de 24,2 M€.</p>
<p style="text-align: justify;">Cette minoration des annulations est proposée dans le cadre du redéploiement de crédits du programme d’investissements d’avenir (PIA) depuis les actions du PIA portées par l’Agence de l’environnement et de la maîtrise de l’énergie (ADEME), vers l’action « Equipex » portée par l’Agence nationale de la recherche (ANR), pour financer les projets « Microcarb » et « Polar Pod ». Le redéploiement concernera pour l’ADEME l’action « Véhicules et transporteurs du futur », à hauteur de 40 M€ et l’action « Démonstrateurs de la transition énergétique », à hauteur de 10,8 M€. Le soutien aux deux projets « Microcarb » et « Polar Pod » demeure complet, cette modification constituant un simple ajustement qui permet, tout en maintenant le soutien à « Polar Pod » et « Microcarb », de préserver des moyens sur l’action « Véhicules et transporteurs du futur » du PIA en vue de la conclusion des assises de la mobilité.</p>
<p style="text-align: justify;">Cet amendement est complété par un amendement miroir sur le programme 172 « Recherches scientifiques et technologiques pluridisciplinaires », de la mission « Recherche et enseignement supérieur ».</p>
You can just escape all the text inside the elements(using element.text()
) to preserve the tags, however, you will have to use StringEscapeUtils.unescapeXml()
in order to remove extra &s;
added by the 'Document' when you plan on using the string.
References: SO: jsoup encode special characters.
Upvotes: 1