2010-02-21 22 views
5

tôi có chức năng này:TagSoup thất bại trong việc phân tích tài liệu html từ một StringReader (java)

private Node getDOM(String str) throws SearchEngineException { 

       DOMResult result = new DOMResult(); 

       try { 
         XMLReader reader = new Parser(); 
         reader.setFeature(Parser.namespacesFeature, false); 
         reader.setFeature(Parser.namespacePrefixesFeature, false); 
         Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
         transformer.transform(new SAXSource(reader,new InputSource(new StringReader(str))), result); 
       } catch (Exception ex) { 
         throw new SearchEngineException("NukatSearchEngine.getDom: " + ex.getMessage()); 
       } 

       return result.getNode(); 
     } 

Phải mất một String chứa tài liệu html gửi bởi máy chủ http sau một yêu cầu POST, nhưng thất bại trong việc phân tích cú pháp nó đúng - tôi chỉ nhận được bốn nút từ toàn bộ tài liệu. Chuỗi chính nó trông ổn - nếu tôi in nó ra và copypasta nó vào một tài liệu văn bản tôi thấy trang tôi mong đợi.

Khi tôi sử dụng một phiên bản quá tải của các phương pháp trên:

private Node getDOM(URL url) throws SearchEngineException { 

       DOMResult result = new DOMResult(); 

       try { 
         XMLReader reader = new Parser(); 
         reader.setFeature(Parser.namespacesFeature, false); 
         reader.setFeature(Parser.namespacePrefixesFeature, false); 
         Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
         transformer.transform(new SAXSource(reader, new InputSource(url.openStream())), result); 
       } catch (Exception ex) { 
         throw new SearchEngineException("NukatSearchEngine.getDom: " + ex.getMessage()); 
       } 

       return result.getNode(); 
     } 

sau đó mọi thứ hoạt động tốt - Tôi nhận được một cây DOM thích hợp, nhưng tôi cần phải bằng cách nào đó lấy câu trả lời POST từ máy chủ.

Lưu trữ chuỗi trong một tệp và đọc lại chuỗi đó không hoạt động - vẫn nhận được kết quả tương tự.

Điều gì có thể là vấn đề?

Trả lời

0

Để nhận được phản hồi POST trước tiên bạn cần thực hiện yêu cầu POST, new InputSource(url.openStream()) có thể mở một kết nối và đọc phản hồi từ yêu cầu GET. Kiểm tra Sending a POST Request Using a URL.

khả năng khác có thể là thú vị để kiểm tra để thực hiện yêu cầu POST và nhận được câu trả lời:

1

Điều này có vẻ giống như sự cố mã hóa. Trong ví dụ mã của bạn không hoạt động, bạn chuyển url dưới dạng chuỗi vào hàm tạo, sử dụng nó làm systemId và bạn gặp sự cố với Thẻ phân tích cú pháp html. Trong ví dụ mà các công trình bạn đang truyền luồng vào bộ tạo đầu vào của InputSource. Sự khác biệt là khi bạn truyền vào luồng thì việc thực hiện SAX có thể tìm ra mã hóa từ luồng.

Nếu bạn muốn kiểm tra này, bạn có thể thử các bước sau:

  • Luồng html bạn đang phân tích thông qua một java.io.InputStreamReader và gọi getEncoding vào nó để xem những gì nó phát hiện mã hóa.
  • Trong mã ví dụ đầu tiên của bạn, hãy gọi setEncoding trên InputSource truyền trong bảng mã mà inputStreamReader đã báo cáo.
  • Xem ví dụ đầu tiên, thay đổi để đặt mã hóa một cách rõ ràng, phân tích cú pháp html chính xác.

Có một cuộc thảo luận về điều này ở cuối bài viết trên using the SAX InputSource.

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