2011-09-03 17 views
10

Tôi muốn truy vấn tài liệu HTML dưới dạng XML (ví dụ: với XPath), vì vậy tôi cần chuyển HTML thông qua một số hình thức dọn dẹp HTML.Có bất kỳ trình phân tích cú pháp HTML Java nào trong đó các nút được tạo giữ lại các chỉ mục cho văn bản gốc không?

Nhưng tôi cũng muốn thực hiện sửa đổi đối với chuỗi nguồn gốc dựa trên kết quả của truy vấn.

Có một trình phân tích cú pháp HTML Java xung quanh giữ lại các chỉ mục cho chuỗi nguồn gốc, vì vậy tôi có thể định vị một nút và sửa đổi phần chính xác của chuỗi gốc không?

Chúc mừng.

+2

Sẽ tốt hơn nếu bạn làm việc với DOM và sau đó chuyển đổi nó thành một biểu diễn chuỗi? Bạn sẽ có phiên bản HTML rõ ràng hơn cùng với các thay đổi của mình. Có lý do cụ thể nào mà bạn cần sửa đổi chuỗi nguồn gốc không? –

+0

Tôi có thể nghĩ về một. Nó giúp bạn dễ dàng tìm ra những sửa đổi nội dung nào đã được thực hiện nếu bạn không phải lội qua một loạt các thay đổi văn bản chỉ là kết quả của việc giải mã XML một chút khác biệt. –

+0

Vivin - Tôi đang cố gắng 'làm sạch' các mục nhạy cảm nhất định từ các trang HTML để tôi có thể chạy các kiểm tra phân tích cú pháp khác với HTML gốc (với dữ liệu nhạy cảm được ghi đè bằng 999 hoặc xxx vv). Ngoài ra, tôi muốn các bài kiểm tra khác nhau có thể chạy trong cả Java và Javascript, vì vậy nguồn gốc là điểm khởi đầu tốt nhất cho tôi, vì trình phân tích HTML HTML và trình phân tích cú pháp HTML của mỗi trình duyệt có thể dẫn đến các DOM khác nhau không nên). –

Trả lời

0

Tôi không biết về phần "giữ lại chỉ mục cho văn bản gốc" nhưng Jericho là một thư viện phân tích cú pháp HTML rất tốt.

Dưới đây là một ví dụ về cách để loại bỏ tất cả các khoảng thời gian từ một html:

public static String removeSpans(String html) { 
    Source source = new Source(html); 
    source.fullSequentialParse(); 
    OutputDocument outputDocument = new OutputDocument(source); 
    List<Tag> tags = source.getAllTags(); 
    for (Tag tag : tags) { 
     String tagname = tag.getName().toLowerCase(); 
     if (tagname.equals("span")) { 
      //remove the <span> 
      outputDocument.remove(tag); 
     } 
    } 
    return outputDocument.toString(); 
} 
+0

Xin lỗi vì câu trả lời, nhưng câu trả lời này không liên quan đến câu hỏi của tôi. –

0

Như những người khác đã đề xuất, có thể bạn muốn kết xuất DOM. Điều này về cơ bản chỉ có nghĩa là xây dựng cây nút, nó sẽ không thay đổi nguồn tài liệu trừ khi bạn sử dụng một trình dọn dẹp HTML như jTidy. Sau đó, bạn có thể truy cập dễ dàng vào tài liệu và có thể sửa đổi tài liệu theo yêu cầu. Tôi sẽ đề nghị DOM4J, nó có một api tốt và hỗ trợ xpath quá.

Yêu cầu "lập chỉ mục" của bạn, trong quá trình duyệt/truy vấn tài liệu bạn có thể lưu trong danh sách hoặc ánh xạ bất kỳ thành phần hoặc nút nào mà bạn muốn sửa đổi văn bản tại điểm sau này.

2

Có vẻ như Jericho gần như chính xác những gì bạn muốn. Nó là một trình phân tích cú pháp HTML mạnh mẽ được thiết kế đặc biệt để thực hiện các sửa đổi không xâm nhập vào tài liệu nguồn.

Mặc dù không có giao diện DOM, SAX hoặc StAX, API có các API tùy chỉnh tương tự với các tiêu chuẩn mà bạn có thể điều chỉnh cách tiếp cận dễ dàng hoặc viết bộ điều hợp giữa mọi thứ bạn đang sử dụng và Jericho. Ví dụ, bạn có thể thực hiện các truy vấn XPath trên các tài liệu Jericho sử dụng Jaxen - xem this blog entry cho một ví dụ.

Jericho có begin và thuộc tính kết thúc cho mọi phần tử và thậm chí là các phần của phần tử như tên thẻ hoặc thậm chí tên thuộc tính, do đó bạn có thể chỉnh sửa tài liệu với thông tin đó, nhưng Jericho thực sự tỏa sáng là OutputDocument class, cho phép bạn chỉ định các thay thế trực tiếp bằng cách gọi các phương thức thích hợp với các phần tử Jericho phù hợp với truy vấn của bạn thay vì phải gọi getBegin() và getEnd() một cách rõ ràng và chuyển nó tới một phương thức thay thế nào đó.

+0

Tôi cũng sẽ kiểm tra điều này. Cảm ơn. Tôi sẽ quay lại và trả lời mỗi khi tôi đã thử chúng. –

0

này hoạt động tuyệt vời

http://jtidy.sourceforge.net/

VÍ DỤ

Tidy tidy = new Tidy(); // obtain a new Tidy instance 
tidy.setXHTML(boolean xhtml); // set desired config options using tidy setters 
...       // (equivalent to command line options) 

tidy.parse(inputStream, System.out); 

Đối với bò DOM, tôi khuyên bạn nên sử dụng JDOM, theo cách của mình nhanh hơn sau đó XML đơn giản.

http://www.jdom.org/

DocumentBuilderFactory factory = 
DocumentBuilderFactory.newInstance(); 
DocumentBuilder builder = factory.newDocumentBuilder(); 
Document doc = builder.newDocument(); 
Element root = doc.createElement("root"); 
Text text = doc.createText("This is the root"); 
root.appendChild(text); 
doc.appendChild(root); 

Theo như thực hiện là có liên quan tôi sẽ làm cho một tài liệu mới, và thêm các nút để nó ra khỏi nguồn.

1

Chúng tôi sử dụng jericho html parser để thực hiện phân tích cú pháp và htmlcleaner để làm sạch thực tế.

Chúng tôi gặp sự cố với hành vi của jericho trong ứng dụng máy chủ (quản lý bộ nhớ, ghi nhật ký) mà chúng tôi đã khắc phục. (nhà phát triển ban đầu không nghĩ rằng các vấn đề của chúng tôi đủ quan trọng để đưa vào chi nhánh mã chính). Our fork is on github. Chúng tôi cũng đã thực hiện fixes to htmlcleaner.

0

Bạn có thể thử ANTLR với số HTML grammar.

Bạn có thể kéo dài (ít nhất) 2 cách tiếp cận - hãy thử và sử dụng nó như một phân tích cú pháp HTML thực tế, và sau đó nhận được các chỉ số vào chuỗi ban đầu mà bạn quan tâm đến

Hoặc, nó cũng có built-. hỗ trợ cho việc chuyển đổi tại chỗ trên văn bản nguồn, nơi bạn xác định các phép biến đổi mà bạn muốn thực hiện trên văn bản như là một phần của ngữ pháp.

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