2013-08-14 58 views
6

Tôi gặp sự cố khi tôi muốn lọc một số văn bản nhất định có thể chứa html. Tôi sử dụng jsoup để lập danh sách trắng và xóa các thẻ hoạt động khá tốt.Xóa thuộc tính Jsoup trên thẻ html

Tôi chỉ gặp sự cố là một số thẻ có thể chứa thuộc tính, chủ yếu là kiểu hoặc lớp nhưng cũng có thể có các thuộc tính khác nhau. (tên, mục tiêu, vv) Khi làm sạch điều này là không có vấn đề bởi vì chúng bị tước đi độc đáo nhưng khi danh sách trắng một số thẻ sẽ được cho phép bị chặn vì các thuộc tính. Danh sách trắng cơ bản dường như không bao gồm các thuộc tính lớp hoặc thuộc tính cộng với tôi không thể làm hỏng những gì khác mà tôi đang gặp phải.

Vì tôi muốn cho phép khá nhiều thẻ, nhưng loại bỏ hầu hết các thẻ trong khi làm sạch, tôi không muốn thêm tất cả các thuộc tính cho tất cả các thẻ mà tôi cho phép. Cách đơn giản nhất là loại bỏ tất cả các thuộc tính khỏi tất cả các thẻ, vì tôi không quan tâm đến chúng và sau đó kiểm tra xem văn bản bị tước với các thẻ đơn giản có hợp lệ hay không.

Có chức năng loại bỏ tất cả các thuộc tính hoặc một số vòng lặp đơn giản hay không, một tùy chọn khác là để cho các danh sách trắng bỏ qua tất cả các thuộc tính và chỉ đơn giản là danh sách trắng trên thẻ.

+0

liên quan: http://stackoverflow.com/questions/14303691/why-does-jsoup-remove-element-ids/14303971#14303971 –

Trả lời

13

Giải pháp cuối cùng phù hợp với tôi khá đơn giản. Tôi lặp qua tất cả các phần tử, sau đó lặp qua tất cả các thuộc tính và sau đó loại bỏ chúng trên phần tử, để lại cho tôi một phiên bản đã được làm sạch, nơi tôi chỉ phải xác thực các thẻ html. Tôi nghĩ rằng đây không phải là cách gọn gàng nhất để giải quyết vấn đề nhưng nó làm những gì tôi muốn.

** EDIT **

Tôi đã bỏ phiếu nhiều lần cho mã cũ trong khi nó thực sự chứa lỗi người mới bắt đầu tuyệt đối. Bạn không bao giờ có thể xóa trong khi lặp qua cùng một danh sách. Lỗi này chỉ được kích hoạt khi có nhiều thuộc tính bị xóa.

đang upadted với 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; 
Các vấn đề liên quan