Foros aprenderaprogramar.com

Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: xeta21 en 28 de Marzo 2018, 20:07

Título: Expresiones regulares Java regex buscar un patrón en una web y guardar fichero
Publicado por: xeta21 en 28 de Marzo 2018, 20:07
Hola :) Tengo el siguiente programa:

Código: [Seleccionar]
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class getTag2Html {

public static void main (String[] args) throws IOException {
String tag = "<p>";

                URL web = new URL("http://www.insalfonscostafreda.cat/web/");
//comprobar que hi hagi dos paràmetres a l'entrada

                System.out.println("Busquem a : "+web + " l'etiqueta p");
// patró de cerca regexp
String pattern = "<" + tag + ".*\\/?>";

//Iniciem la connexió
web.openConnection();

        BufferedReader in = new BufferedReader( new InputStreamReader(web.openStream()));

        File f = new File("eac2.xml");
        BufferedWriter bw;
        bw = new BufferedWriter(new FileWriter(f));
        String inputLine;
        while ((inputLine = in.readLine()) != null) {
           
            if(inputLine.contains(tag)) {
               
                System.out.println(inputLine);
                bw.write(inputLine + "\n");
            }
        }
        bw.close();
        in.close();
}
}


lo que no sé es como usar la parte:

String pattern = "<" + tag + ".*\\/?>";

el programa me funciona perfectamente pero tengo que usar esta parte y no sé como incorporarla..

gracias!
Título: Re:duda ejercicio con regex!
Publicado por: Ogramar en 24 de Junio 2018, 20:12
Buenas, para escribir en los foros deben seguirse las indicaciones que se dan en https://aprenderaprogramar.com/foros/index.php?topic=1460.0 donde se explica cómo poner título a los temas, cómo pegar código, etc.

Si no se tienen las bases de Java fundamentales recomendamos seguir el curso Java desde cero: https://aprenderaprogramar.com/index.php?option=com_content&view=category&id=68&Itemid=188

En el código indicado lo que se usa es una expresión regular para buscar un patrón dentro de una cadena de texto (en este caso dentro del código html de una página web). Para interpretar la expresión regular tenemos que:

String pattern = "<" + tag + ".*\\/?>";

La cadena comienza por "<" seguida del tag indicado. En este caso debemos poner simplemente p o simplemente h2 (según lo que queramos buscar), porque si pones String tag ="<p>" estarías repitiendo dando lugar a que se buscara <<p> lo cual no es correcto.

Por tanto pondríamos String tag = "p"; ó String tag = "h2"; por ejemplo.

Luego el . indica "cualquier carácter". El * es un metacarácter que se usa para indicar que el carácter anterior ocurre cero o una o más de una vez. Es decir, cualquier número de veces. Por tanto tenemos ya <h2> Cualquier cantidad de caracteres

\\ es la cadena de escape o backslah en las expresiones regulares de Java.

? indica ocurrencia ninguna o una vez. Es decir, que podría existir el carácter / ninguna o una vez.

Hay mucha información sobre expresiones regulares en Java en internet.

Haciendo esta pequeña modificación del código:

Código: [Seleccionar]
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class getTag2Html {

   public static void main (String[] args) throws IOException {
      String tag = "h2";
     
                URL web = new URL("http://www.insalfonscostafreda.cat/web/");
      //comprobar que hi hagi dos paràmetres a l'entrada
     
                System.out.println("Buscando en : "+web + " la etiqueta h2");
         // patró de cerca regexp
         String pattern = "<" + tag + ".*\\/?>";

         //Iniciem la connexió
      web.openConnection();

        BufferedReader in = new BufferedReader( new InputStreamReader(web.openStream()));

        File f = new File("prueba_apr_eac2.xml");
        BufferedWriter bw;
        bw = new BufferedWriter(new FileWriter(f));
        String inputLine;
        while ((inputLine = in.readLine()) != null) {
           
            if(inputLine.contains(tag)) {
               
                System.out.println(inputLine);
                bw.write(inputLine + "\n");
            }
        }
        bw.close();
        in.close();   
   }
}

He obtenido este resultado:

Buscando en : http://www.insalfonscostafreda.cat/web/ la etiqueta h2
h1, h2, h3, h4, h5, h6, .site-title {
<h2 class="item-title" itemprop="headline">
</h2>
<h2 class="item-title" itemprop="headline">
</h2>
<h2 class="item-title" itemprop="headline">
</h2>
<h2 class="item-title" itemprop="headline">
</h2>
<h2 class="item-title" itemprop="headline">
</h2>
<h2 class="item-title" itemprop="headline">
</h2>
<h2 class="item-title" itemprop="headline">
</h2>




Además como en el código está definido que se cree un archivo xml donde se guarden estos resultados, se ha creado dicho archivo.

Salu2