2013-08-14 13 views
6

Mam problem, że chcę filtrować określone teksty, które mogą zawierać html. Używam jsoup do dodawania białej listy i czyszczenia tagów, które działają całkiem nieźle.Usuwanie atrybutu Jsoup na znacznikach html

Mam tylko problem, że niektóre z tagów mogą zawierać atrybuty, głównie style lub klasy, ale mogą również występować różne atrybuty. (nazwa, cel, itp.) Podczas czyszczenia nie stanowi to problemu, ponieważ są ładnie rozebrane, ale gdy doda się do białej listy niektóre znaczniki, które mogą zostać zablokowane z powodu atrybutów. Podstawowa biała lista nie wydaje się obejmować atrybutów stylu lub klasy oraz nie mogę być pewna, co jeszcze napotkam.

Ponieważ chcę zezwolić na dość szeroki zakres znaczników, ale usuwam większość z nich podczas czyszczenia, nie chcę dodawać wszystkich atrybutów dla wszystkich dozwolonych znaczników. Najprostszym rozwiązaniem byłoby usunięcie wszystkich atrybutów ze wszystkich tagów, ponieważ i tak nie jestem nimi zainteresowany, a następnie sprawdzam, czy usunięty tekst z tagami prostymi jest prawidłowy.

Czy istnieje funkcja, która usuwa wszystkie atrybuty lub jakąś prostą pętlę, inną opcją byłoby powiadomienie białej listy o zignorowaniu wszystkich atrybutów i po prostu umieszczenie na białej liście tagów.

+0

Related: http://stackoverflow.com/questions/14303691/why-does-jsoup-remove-element-ids/14303971#14303971 –

Odpowiedz

13

Rozwiązanie, które w końcu mi się udało, jest dość proste. Przejmuję wszystkie elementy, następnie przechodzę przez wszystkie atrybuty, a następnie usuwam je z elementu, co pozostawia mi w oczyszczonej wersji, w której muszę tylko sprawdzić same znaczniki html. Myślę, że to nie jest najmilszy sposób, aby rozwiązać problem, ale robi to, co chciałem.

** EDIT **

mam upvoted wielokrotnie do starego kodu, podczas gdy w rzeczywistości zawierała początkujących błąd. Nigdy nie można usunąć podczas iteracji za pośrednictwem tej samej listy. Ten błąd wystąpił tylko wtedy, gdy usunięto więcej niż jeden atrybut.

upadted kod z bugfix

Document doc = Jsoup.parseBodyFragment(aText); 
Elements el = doc.getAllElements(); 
List<String> attToRemove = new ArrayList<>(); 
for (Element e : el) { 
    Attributes at = e.attributes(); 
    for (Attribute a : at) { 
     attToRemove.add(a.getKey()); 
    } 

    for(String att : attToRemove) { 
     e.removeAttr(att); 
    } 
} 
if(Jsoup.isValid(doc.body().html(), theLegalWhitelist)) 
    return true; 
else 
    return false; 
Powiązane problemy