在JSoup中接受<img/>标记的相对路径

时间:2011-07-09 14:54:19

标签: jsoup

以下是我需要解析的文本示例。

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

我需要进行清理。因此,应用以下代码将删除src属性,因为它不以有效协议开头。无论如何配置Jsoup来获取属性?我想尽可能避免使用绝对网址。

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

3 个答案:

答案 0 :(得分:8)

只要在清洁时指定base URI,jsoup清洁器就会允许相对链接。这样就可以根据允许的协议确认链路的协议。请注意,在您的示例中,您使用的是没有基URI的clean方法,因此无法解析链接,因此必须将其删除。

例如为:

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

请注意,在当前版本中,清理后任何相对链接都将转换为绝对链接。我只是committed a change(在下一个版本中提供),它可以选择保留相对链接。

语法将是:

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

答案 1 :(得分:2)

不幸的是,接受的答案对我不起作用,因为我必须支持多个域(包括多个开发环境和多个生产站点)。所以我们确实需要相对的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是一个Spring类,它只包含反射API抛出的已检查异常)

答案 2 :(得分:1)

这可能会有所帮助:

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