1 import java.io.*;
2 import java.net.URL;
3 import java.util.regex.*;
4
5 public class LectorDeLinks {
6 //Vamos a hacer uso de expresiones regulares. Dominarlas lleva una tarde (intensa) de estudio.
7 //Concretaremos en la que nos interesa...
8 //Queremos localizar expresiones del tipo: href="X"
9 //Esas X podrán tener cualquier carácter menos " lo que se especifica como: [^"]
10 //Y además pueden tener cualquier longitud, lo que se incluye poniendo: [^"]*
11 //Así que nuestra expresión regular es: href="[^"]*"
12 //Localizadas estas expresiones, las zonas que se quieran "capturar" se ponen entre paréntesis
13 //En nuestro caso es lo que hemos llamado X: href="([^"]*)"
14 //Pondremos la expresión en una String, por lo que las comillas deben ser precedidas por \: "href=\"([^\"]*)\""
15 private static final Pattern PATRON=Pattern.compile("href=\"([^\"]*)\"");
16
17 public static void main(String[] args) throws IOException {
18 //Lectura de los links tal cual estan
19 version1();
20 //Lectura de ls links convirtiendo en absolutos los que son relativos
21 //además en la versión anterior hemos leido de un buffered porque es como hemos actuado siempre al querer lineas
22 //Para este caso en realidad no es preciso y podemos hacer la lectura a más bajo nivel (con menos "envolorio")
23 version2();
24 }
25
26 private static void version1() throws IOException {
27 URL url=new URL("http://gtts.ehu.es/German/Docencia/TAP/index.jsp");
28
29 //Vamos a leer todo el fichero remoto sobre un StringBuilder linea a linea
30 //los caracteres de paso de linea no los regeneramos porque no nos importan
31 BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream()));
32 StringBuilder sb=new StringBuilder();
33 String linea;
34 while ((linea = br.readLine()) != null) sb.append(linea);
35 br.close();
36
37 //De la pagina web que tenemos ya en StringBuilder vamos a listar los enlaces "href"
38 Matcher m=PATRON.matcher(sb);
39 while(m.find()) System.out.println(m.group(1));
40 }
41
42 private static void version2() throws IOException {
43 String dirBase="http://gtts.ehu.es/German/Docencia/TAP/";
44 URL url=new URL(dirBase+"index.jsp");
45
46 //Vamos a leer todo el fichero remoto sobre un StringBuilder
47 //en bloques de 4096 caracteres
48 Reader reader=new InputStreamReader(url.openStream());
49 StringBuilder sb=new StringBuilder();
50 char[] buffer=new char[4096];
51 int numBytes;
52 while ((numBytes=reader.read(buffer)) != -1) sb.append(buffer,0,numBytes);
53 reader.close();
54
55 //Para la pagina web que tenemos ya en StringBuilder vamos generar un objeto capaz de hacer el "match" con el patron definido
56 //y a ir buscado cada "match" y sacando el grupo de captura definido en el patrón.
57 Matcher m=PATRON.matcher(sb);
58 while(m.find()) {
59 String link=m.group(1);
60 System.out.println(link.startsWith("http")?link:dirBase+link);
61 }
62 }
63 }
64