2011-07-09 57 views
6

以下是我需要解析的文本示例。接受JSoup中的相对路径clean for <img>标签

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

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

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

回答

7

只要清洁时指定了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

谢谢。你的改变,以保持相对的链接将是一个完美的解决方案,我的情况。 – st1

+0

但它还没有 – Bozho

+1

我不确定它被引用的是哪个发行版,但在编写本文时,最新版本是1.7.2,它可以选择保留相对链接。 – ivarni

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是春天的一类,它只是包装了由反射API抛出的checked异常)

0

这可能是有益的:

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