Использование jsoup для экранирования запрещенных тегов - PullRequest
1 голос
/ 20 февраля 2012

Я оцениваю jsoup на функциональность, которая очищает (но не удаляет!) Теги, не входящие в белый список.Допустим, разрешен только тег <b>, поэтому следующий ввод

foo <b>bar</b> <script onLoad='stealYourCookies();'>baz</script>

должен выдать следующее:

foo <b>bar</b> &lt;script onLoad='stealYourCookies();'&gt;baz&lt;/script&gt;

Я вижу следующие проблемы / вопросы с jsoup:

  • document.getAllElements() всегда предполагает <html>, <head> и <body>.Да, я могу позвонить document.body().getAllElements(), но дело в том, что я не знаю, является ли мой источник полным документом HTML или просто телом - и я хочу, чтобы результат был в той же форме и форме, в которой он был;
  • как заменить <script>...</script> на &lt;script&gt;...&lt;/script&gt;?Я только хочу заменить скобки на экранированные объекты и не хочу изменять какие-либо атрибуты и т. Д. Node.replaceWith звучит как излишнее для этого.
  • Возможно ли полностью отключить красивую печать (например, вставка новойлинии и т. д.)?

Или, может быть, мне стоит использовать другой фреймворк?До сих пор я смотрел на htmlcleaner , но приведенные примеры не предполагают, что моя желаемая функциональность поддерживается.

1 Ответ

5 голосов
/ 09 февраля 2013

Ответ 1

Как загрузить / проанализировать Document с помощью Jsoup? Если вы используете parse() или connect().get(), jsoup автоматически отформатирует ваш html (вставив теги html, body и head). Это гарантирует, что у вас всегда будет полный HTML-документ, даже если ввод не завершен.

Предположим, что вы хотите только очистить ввод (без дальнейшей обработки), вам следует использовать clean() вместо предыдущих перечисленных методов.

Пример 1 - Использование parse ()

final String html = "<b>a</b>";

System.out.println(Jsoup.parse(html));

Выход:

<html>
 <head></head>
 <body>
  <b>a</b>
 </body>
</html>

Ввод html завершен, чтобы убедиться, что у вас есть полный документ.

Пример 2 - Использование clean ()

final String html = "<b>a</b>";

System.out.println(Jsoup.clean("<b>a</b>", Whitelist.relaxed()));

Выход:

<b>a</b>

Введенный html очищен, не более.

Документация:


Ответ 2

Метод replaceWith() делает именно то, что вам нужно:

Пример:

final String html = "<b><script>your script here</script></b>";
Document doc = Jsoup.parse(html);

for( Element element : doc.select("script") )
{
    element.replaceWith(TextNode.createFromEncoded(element.toString(), null));
}

System.out.println(doc);

Выход:

<html>
 <head></head>
 <body>
  <b>&lt;script&gt;your script here&lt;/script&gt;</b>
 </body>
</html>

или только тело :

System.out.println(doc.body().html());

Выход:

<b>&lt;script&gt;your script here&lt;/script&gt;</b>

Документация:


Ответ 3

Да, prettyPrint() метод Jsoup.OutputSettings делает это.

Пример:

final String html = "<p>your html here</p>";

Document doc = Jsoup.parse(html);
doc.outputSettings().prettyPrint(false);

System.out.println(doc);

Примечание: , если метод outputSettings() недоступен, пожалуйста, обновите Jsoup.

Выход:

<html><head></head><body><p>your html here</p></body></html>

Документация


Ответ 4 (без пули)

Нет! Jsoup - одна из лучших и большинства способных HTML-библиотек!

...