2010-02-21 6 views
5

Ho questa funzione:Tagsoup non riesce ad analizzare il documento HTML da una 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(); 
     } 

Ci vuole una stringa che contiene il documento HTML inviato dal server http, dopo una richiesta POST, ma non riesce a analizzare correttamente - Ho solo quattro nodi dell'intero documento. La stessa stringa sembra a posto - se la stampo e copypasta in un documento di testo vedo la pagina che mi aspettavo.

Quando uso una versione di overload del metodo di cui sopra:

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

poi tutto funziona bene - ho un albero DOM corretta, ma ho bisogno di recuperare in qualche modo la risposta POST dal server.

Memorizzare la stringa in un file e leggerla di nuovo non funziona, ottenendo sempre gli stessi risultati.

Quale potrebbe essere il problema?

risposta

0

Per ottenere una risposta POST è necessario prima eseguire una richiesta POST, new InputSource(url.openStream()) probabilmente apre una connessione e legge la risposta da una richiesta GET. Controlla Sending a POST Request Using a URL.

Altre possibilità che potrebbe essere interessante per verificare per fare richieste POST e ottenere la risposta:

1

Questo sembra un problema di codifica. Nell'esempio di codice del tuo che non funziona stai passando l'url come stringa al costruttore, che lo usa come systemId, e ottieni problemi con Tagoup che analizza l'html. Nell'esempio che funziona stai passando lo stream al costruttore di InputSource. La differenza è che quando si passa nello stream, l'implementazione SAX può capire la codifica dallo stream.

Se si vuole verificare questa si potrebbe provare questi passaggi:

  • flusso il codice html che stai analisi attraverso un java.io.InputStreamReader e chiamare getEncoding su di esso per vedere che cosa la codifica rileva.
  • Nel primo codice di esempio, chiamare setEncoding su InputSource passando nella codifica che inputStreamReader ha segnalato.
  • Vedere se il primo esempio, modificato per impostare esplicitamente la codifica, analizza correttamente l'html.

C'è una discussione di questo verso la fine di un articolo su using the SAX InputSource.

Problemi correlati