2010-02-21 13 views
5

Tengo esta función:Tagsoup no puede analizar el documento HTML de 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(); 
     } 

toma una cadena que contiene el documento HTML enviados por el servidor HTTP después de una solicitud POST, pero no puede analizar es correcto: solo obtengo como cuatro nodos de todo el documento. La cadena en sí misma se ve bien, si la imprimo y la copio en un documento de texto, veo la página que esperaba.

Cuando uso una versión sobrecargada del método anterior:

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

entonces todo funciona bien - consigo un árbol DOM adecuada, pero necesito recuperar de alguna manera la respuesta post de servidor.

Almacenar la cadena en un archivo y leerla de nuevo no funciona, obteniendo los mismos resultados.

¿Cuál podría ser el problema?

Respuesta

0

Para obtener una respuesta POST primero debe realizar una solicitud POST, new InputSource(url.openStream()) probablemente abra una conexión y lea la respuesta de una solicitud GET. Consulte Sending a POST Request Using a URL.

Otras posibilidades que pueden ser interesantes para comprobar hacia fuera para hacer las peticiones POST y obtener la respuesta:

1

¿Es tal vez un problema con la codificación XML?

1

Parece un problema de codificación. En el ejemplo de código tuyo que no funciona, pasas la url como una cadena al constructor, que la usa como el identificador del sistema, y ​​obtienes problemas con Tagsoup al analizar el html. En el ejemplo que funciona, está pasando la secuencia al constructor de InputSource. La diferencia es que cuando pasas la transmisión, la implementación de SAX puede averiguar la codificación de la transmisión.

Si desea probar esta podría intentar estos pasos:

  • corriente del html que estés a través de un análisis java.io.InputStreamReader y llame getEncoding en él para ver qué codificación que detecta.
  • En su primer código de ejemplo, llame a setEncoding en el InputSource pasando la codificación que informó el inputStreamReader.
  • Vea si el primer ejemplo, cambiado para establecer explícitamente la codificación, analiza el html correctamente.

Hay una discusión de esto hacia el final de un artículo en using the SAX InputSource.

Cuestiones relacionadas