2011-07-09 56 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");