2011-12-02 40 views
6

Tôi đang tìm cách tiếp cận hiệu quả để trích xuất một đoạn HTML từ trang web và thực hiện một số thao tác cụ thể trên đoạn HTML đó.Trích xuất và xóa HTML Fragment bằng cách sử dụng HTML Parser (org.htmlparser)

Các hoạt động cần thiết là:

  1. Remove tất cả các thẻ đó có một lớp học của "ẩn"
  2. Hủy bỏ tất cả các thẻ script
  3. Hủy bỏ tất cả các thẻ phong cách
  4. Hủy bỏ tất cả các sự kiện thuộc tính (trên * = "*")
  5. Xóa tất cả các thuộc tính kiểu

Tôi đã sử dụng HTML Parser (org.htmlparser) cho nhiệm vụ này và đã có thể đáp ứng tất cả các yêu cầu, tuy nhiên, tôi không cảm thấy rằng tôi có một giải pháp thanh lịch. Hiện tại, tôi đang phân tích cú pháp trang web với một số CssSelectorNodeFilter (để lấy đoạn) và sau đó phân tích cú pháp lại đoạn đó bằng NodeVisitor để thực hiện các hoạt động làm sạch.

Ai đó có thể đề xuất cách họ giải quyết vấn đề này? Tôi chỉ muốn phân tích cú pháp tài liệu một lần và thực hiện tất cả các hoạt động trong một phân tích cú pháp đó.

Cảm ơn trước!

Trả lời

6

Kiểm tra jsoup - nó sẽ xử lý tất cả các nhiệm vụ cần thiết của bạn một cách thanh lịch.

[Chỉnh sửa]

Dưới đây là một ví dụ làm việc đầy đủ cho mỗi hoạt động cần thiết của bạn:

// Load and parse the document fragment. 
File f = new File("myfile.html"); // See also Jsoup#parseBodyFragment(s) 
Document doc = Jsoup.parse(f, "UTF-8", "http://example.com"); 

// Remove all script and style elements and those of class "hidden". 
doc.select("script, style, .hidden").remove(); 

// Remove all style and event-handler attributes from all elements. 
Elements all = doc.select("*"); 
for (Element el : all) { 
    for (Attribute attr : el.attributes()) { 
    String attrKey = attr.getKey(); 
    if (attrKey.equals("style") || attrKey.startsWith("on")) { 
     el.removeAttr(attrKey); 
    } 
    } 
} 
// See also - doc.select("*").removeAttr("style"); 

Bạn sẽ muốn chắc chắn những thứ như trường hợp nhạy cảm không quan trọng cho các tên thuộc tính nhưng đây sẽ là phần lớn những gì bạn cần.

+0

Tôi sẽ xem xét jsoup. Nếu nó cung cấp một khuôn khổ tốt hơn để giải quyết vấn đề của tôi, sau đó tôi sẽ gửi một câu trả lời ủng hộ nó sử dụng cho các yêu cầu của tôi. Cảm ơn vì tiền hỗ trợ. –

+0

@KieranHall: xem câu trả lời cập nhật của tôi với ví dụ làm việc. – maerics

+0

cách lấy chuỗi trả về sau khi xóa thuộc tính? –

Các vấn đề liên quan