2010-02-21 32 views
5

我有這樣的功能:Tagsoup無法解析從StringReader(JAVA)的HTML文檔

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(); 
     } 

它需要包含一個POST請求後,由HTTP服務器發送的HTML文檔中的字符串,但無法解析它正確 - 我只從整個文檔中得到四個節點。字符串本身看起來很好 - 如果我將它打印出來並將其複製到文本文檔中,我會看到我期望的頁面。

當我用上面的方法的重載版本:

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(); 
     } 

然後一切工作就好了 - 我得到適當的DOM樹,但我需要以某種方式從服務器檢索的POST答案。

將字符串存儲在文件中並讀取它不起作用 - 仍然獲得相同的結果。

可能是什麼問題?

回答

1

這看起來像一個編碼問題。在你的代碼不起作用的例子中,你將URL作爲字符串傳遞給構造函數,該構造函數使用它作爲systemId,並且你使用Tagsoup解析html。在這個例子中,您將流傳遞給InputSource構造函數。不同之處在於,當您傳入流時,SAX實現可以從流中計算出編碼。

如果你想測試這個,你可以嘗試以下步驟:

  • 流你通過一個java.io.InputStreamReader中的解析,並呼籲getEncoding它來看看有什麼編碼它檢測到HTML。
  • 在您的第一個示例代碼中,在InputSource調用inputStreamReader報告的編碼時調用setEncoding。
  • 看看第一個例子,如果更改爲顯式設置編碼,則正確解析html。

using the SAX InputSource上有一篇關於文章末尾的討論。