2011-07-09 11 views
6

Poniżej znajduje się przykład tekstu, który należy przeanalizować.Akceptowanie ścieżek względnych w tagach JSoup clean dla <img>

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

Potrzebuję wykonać porządki. Zatem zastosowanie następującego kodu spowoduje usunięcie atrybutu src, ponieważ nie zaczyna się od prawidłowego protokołu. W każdym razie, aby skonfigurować Jsoup do pobrania atrybutu? Chcę, jeśli to możliwe, unikać używania bezwzględnego adresu URL.

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

Odpowiedz

7

Odkurzacz jsoup pozwoli łącza względne, tak długo, jak base URI jest określona podczas czyszczenia. W ten sposób protokół łącza może zostać potwierdzony przez dozwolone protokoły. Zauważ, że w twoim przykładzie używasz czystej metody bez podstawowego identyfikatora URI, więc nie można rozwiązać problemu, a więc trzeba go usunąć.

Np .:

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

Należy zauważyć, że w aktualnej wersji względnych linki przekształcić bezwzględnych linki po czyszczeniu. Właśnie mam committed a change (dostępny w następnym wydaniu), który opcjonalnie pozwoli na zachowanie względnych linków.

Składnia będą:

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

Dzięki. Twoja zmiana w celu zachowania względnych linków będzie idealnym rozwiązaniem dla mojej sytuacji. – st1

+0

, ale jeszcze jej tam nie ma. – Bozho

+1

Nie jestem pewien, do którego wydania jest skierowany, ale w chwili pisania najnowszej wersji jest 1.7.2 i ma opcję zachowania względnych linków. – ivarni

2

Niestety, zaakceptowane odpowiedź nie działa dla mnie, bo mam do obsługi wielu domen (w tym środowisku wielu dev i wielu zakładów produkcyjnych). Tak naprawdę potrzebujemy względnych adresów URL (niezależnie od niebezpieczeństw, które one wywołują). Więc oto co zrobiłem to zrobić:

// 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 jest klasą przez sprężynę, która po prostu opakowuje sprawdzonych wyjątki generowane przez odbicia API)

0

może to być pomocne:

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