Принятие относительных путей в JSoup clean для тегов <img> - PullRequest
7 голосов
/ 09 июля 2011

Ниже приведен пример текста, который мне нужно проанализировать.

<P>The symbol <IMG id="pic1" height=15 src="images/itemx/image001.gif" width=18>indicates......</P>

Мне нужно выполнить очистку.Таким образом, применение следующего кода удалит атрибут src, так как он не начинается с допустимого протокола.В любом случае настроить Jsoup для получения атрибута?Я хочу, чтобы избежать использования абсолютного URL, если это возможно.

Jsoup.clean(content, Whitelist.basicWithImages());

Ответы [ 3 ]

8 голосов
/ 16 июля 2011

Очиститель jsoup разрешает относительные ссылки, если при очистке указано base URI. Это значит, что протокол соединения может быть подтвержден на основе разрешенных протоколов. Обратите внимание, что в вашем примере вы используете метод clean без базового URI, поэтому ссылка не может быть разрешена и поэтому должна быть удалена.

т.д .:

String clean = Jsoup.clean(html, "http://example.com/", 
   Whitelist.basicWithImages());

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

Синтаксис будет:

String clean = Jsoup.clean(html, "http://example.com/",
    Whitelist.basicWithImages().preserveRelativeLinks(true));
2 голосов
/ 16 марта 2012

К сожалению, принятый ответ не работает для меня, потому что я должен поддерживать несколько доменов (включая среду разработки и несколько рабочих сайтов).Поэтому нам действительно нужны относительные URL-адреса (независимо от того, какую опасность это приносит).Вот что я сделал, чтобы сделать это:

// allow relative URLs. JSoup doesn't support that, so we use reflection
// removing the list of allowed protocols, which means all protocols are allowed
Field field = ReflectionUtils.findField(WHITELIST.getClass(), "protocols");
ReflectionUtils.makeAccessible(field);
ReflectionUtils.setField(field, WHITELIST, Maps.newHashMap());

(ReflectionUtils - это класс к весне, который просто оборачивает проверенные исключения, генерируемые API отражения)

1 голос
/ 11 июня 2015

Это может быть полезно:

whitelist.removeProtocols("a", "href", "ftp", "http", "https", "mailto");
whitelist.removeProtocols("img", "src", "http", "https");
...