• Domingo 17 de Noviembre de 2024, 18:46

Autor Tema:  Convertir Un Html En Texto Plano  (Leído 3800 veces)

silverfox

  • Miembro MUY activo
  • ***
  • Mensajes: 280
    • Ver Perfil
Convertir Un Html En Texto Plano
« en: Jueves 23 de Marzo de 2006, 12:52 »
0
Buenas.

He tenido un problemilla con algo como esto. Ya lo he resuelto, así que no me corre prisa, pero me gustaría saber si alguien tiene otra solución distinta a la mía que sea más rápida.

El problema consiste en coger un archivo HTML, que puede o no estar bien formado, y convertirlo en texto plano, es decir, sin etiquetas ni comentarios. No es necesario hacer nada especial con las etiquetas, ni siquiera formatear el texto de salida.
Ejemplo:

De esto:
Código: Text
  1.  
  2. <HTML>
  3. <HEAD>
  4. <TITLE> TITULO </TITLE>
  5. <META NAME="Author" CONTENT="Silverfox">
  6.  
  7. </HEAD>
  8.  
  9. <BODY>
  10. <div>
  11.   <CENTER>Prueba para transformar</CENTER>
  12.   <!-- esto no tiene que salir -->
  13.   <br>
  14.   <br>
  15.   Prueba para el foro de solo código
  16. </div>
  17.  
  18. </BODY>
  19. </HTML>
  20.  
  21.  

Debería quedar esto:

Código: Text
  1.  
  2. Prueba para transformar
  3.  
  4.  
  5. Prueba para el foro de solo código
  6.  
  7.  


¿Se os ocurre algo?


Gracias.




Silverfox

kike_monarcas

  • Miembro activo
  • **
  • Mensajes: 41
    • Ver Perfil
Re: Convertir Un Html En Texto Plano
« Respuesta #1 en: Jueves 23 de Marzo de 2006, 23:45 »
0
Hola. No se mucho sobre el lenguaje HTML, sin embargo antes estuve estudiando un poco sobre el tratamiento de cadenas con Java y por ahi me encontré con las clases StringTokenizer, Pattern y Matcher, las cuales sirven para el manejo de expresiones regulares y poder realizar algo parecido a lo que desea.

Espero que el siguiente fragmento de código, aunque bastante sencillo, le sirva:

    private void eliminarEtiquetas(){
        JTextArea textoPlano = new JTextArea( "", 5, 20 );
        JTextArea etiquetas = new JTextArea( "", 5, 20 );
        String palabra = "";

        // Concordancia
        Pattern er = Pattern.compile( "[<][#|!|-|!| |a-z|A-Z|/|=|\"]+[>]" );
        Matcher matcher = er.matcher( textoHTML.getText() );
       
        while( matcher.find() ){
            etiquetas.append( matcher.group() + "\n" );
        }
       
        JOptionPane.showMessageDialog( this, new JScrollPane( etiquetas ), getTitle(),
                JOptionPane.INFORMATION_MESSAGE );

        // Discordancia
        StringTokenizer tokens = new StringTokenizer( textoHTML.getText() );
        while( tokens.hasMoreTokens() ){
            palabra = tokens.nextToken();
            if ( !palabra.matches( "[<][#|!|-|!| |a-z|A-Z|/|=|\"]+[>]" ) )
                textoPlano.append( palabra + "\n" );
        }
       
        JOptionPane.showMessageDialog( this, new JScrollPane( textoPlano ),    getTitle(),
                JOptionPane.INFORMATION_MESSAGE );


Como se puede apreciar en el código en el método matcher se puede poner la expresión regular de lo que se desea aceptar y omitir en los diferentes casos. Asi pues, si algunos de los elementos que se manejan en HTML no está incluido bastará con agregarlos como parámetro de lo que se desea presentar.

Saludos.  :hola:

silverfox

  • Miembro MUY activo
  • ***
  • Mensajes: 280
    • Ver Perfil
Re: Convertir Un Html En Texto Plano
« Respuesta #2 en: Viernes 24 de Marzo de 2006, 08:19 »
0
Muchas gracias kike.
Aunque es sencillo, es un código bastante interesante y, en cierto modo, se aproxima a mi solución.

No lo tengo muy claro con tus patrones, quizá habría que mejorarlos un poco, ten en cuenta que un HTML no tiene que estar bien formado (eso lo coge sin problemas), pero que, además, los tags pueden llevar parámetros y creo que en tus patrones no está incluido. (Pero bueno, se incluye y ya está).


El resultado de la limpieza del fichero debería ser el mismo texto que se viese en la página web, pero en texto plano, o sea, que se coma todas las etiquetas meta, que no saque el título de la página, ni nada parecido. Con tu propuesta en mi ejemplo, quedaría la palabra TITULO arriba, ¿me equivoco?  ;)


Muy buena solución, kike. Me sirve bastante para comparar velocidades de proceso.



¿Alguien quiere intentarlo otra vez?
Esta tarde compartiré yo la mía, a ver qué mejoraríais.



Gracias a todos.



Silverfox

silverfox

  • Miembro MUY activo
  • ***
  • Mensajes: 280
    • Ver Perfil
Re: Convertir Un Html En Texto Plano
« Respuesta #3 en: Lunes 27 de Marzo de 2006, 09:36 »
0
Aunque un poco más tarde de lo que prometí, aquí va la solución que encontré al problema que propuse. Espero daros alguna idea para que me digais otras opciones alternativas mejores.


Tened en cuenta que no puedo usar más que la versión de Java 1.4.2_10 y que no tengo un interfaz gráfico (todo va de forma automática y la salida va a un fichero de log)


Código: Text
  1. JTextPane editor= new JTextPane();
  2. try {
  3.   editor.setContentType(&#34;text/html&#34;);
  4.   BufferedReader br= new BufferedReader (new FileReader(&#34;fichero&#34;)); //tambien con URL.getContent()
  5.   StringBuffer sb= new StringBuffer();
  6.   String txt= null;
  7.   String newline = System.getProperty(&#34;line.separator&#34;);
  8.   while ((txt=br.readLine()) != null){
  9.     sb.append(txt);
  10.     sb.append(newline);  
  11.   }
  12.   
  13.   editor.setText(sb.toString());
  14.  
  15.   System.out.println(editor.getText());
  16.   System.out.println(&#34;***********************&#34;);
  17.   editor.selectAll();
  18.   System.out.println(editor.getSelectedText());
  19.   System.out.println(&#34;***********************&#34;);
  20. } catch (Exception e){
  21.   e.printStackTrace();
  22. }
  23.  


Un saludo a todos.



Silverfox