Foros del Web » Programación para mayores de 30 ;) » Java »

Conseguir ciertos datos de una web.

Estas en el tema de Conseguir ciertos datos de una web. en el foro de Java en Foros del Web. Hola! estoy haciendo un proyecto de final de curso, y lo que quierp hacer es basicamente recopilar informacion de una pagina web, abstraer la informacion ...
  #1 (permalink)  
Antiguo 11/03/2015, 15:32
 
Fecha de Ingreso: marzo-2014
Mensajes: 9
Antigüedad: 10 años, 9 meses
Puntos: 0
Conseguir ciertos datos de una web.

Hola! estoy haciendo un proyecto de final de curso, y lo que quierp hacer es basicamente recopilar informacion de una pagina web, abstraer la informacion que me interesa para luego mostrarla, por ejemplo en Syste.out.printl...
He preguntado a un profesor de forma rapida y me ha dicho que se puede, y que con java es la manera mas facil que con C.

De ser asi, podriais dejarme un ejemplo sencillo de ello con una simple pagina web y un archvo .java?

pd: tengo conocimientos 'intermedios' de java.

muchas gracias comunidad!
  #2 (permalink)  
Antiguo 11/03/2015, 15:45
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 20 años, 2 meses
Puntos: 454
Respuesta: Conseguir ciertos datos de una web.

Hola:

Aquí tienes un ejemplo de cómo leer una web desde java y sacarla por pantalla http://chuwiki.chuidiang.org/index.p...tps_desde_java

La librería de java HtmlUnit puede facilitarte este tipo de tareas, sobre todo en la parte de extraer la información que te interesa a partir de la web descargada. En el siguiente enlace se muestra cómo extraer los enlaces de la página http://chuwiki.chuidiang.org/index.p...os_de_HTMLUnit

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #3 (permalink)  
Antiguo 11/03/2015, 17:49
 
Fecha de Ingreso: marzo-2014
Mensajes: 9
Antigüedad: 10 años, 9 meses
Puntos: 0
Respuesta: Conseguir ciertos datos de una web.

uy bien, gracias

ya casi lo tengo.

solo que me queda abstraer concretamente los datos de la web. por ejemplo

Pattern pattern = Pattern.compile("(?i)s*\\">"\s*\"(.*?)\"");

quiero extraer de una url los caracteres que empiezan desde "> hasta </a> </h2>

pero me da error con la funcion antes mencionada. Parece una tonteria, alguien podrias hecharme este ultimo cable?
  #4 (permalink)  
Antiguo 12/03/2015, 02:19
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 20 años, 2 meses
Puntos: 454
Respuesta: Conseguir ciertos datos de una web.

Hola:

Cambia \\" por \" y te falta otra \ delante de unas comillas en medio de la cadena que no tiene \ delante.

attern pattern = Pattern.compile("(?i)s*\">\"\s*\"(.*?)\"");

Por aquí tienes un ejemplo parecido http://chuwiki.chuidiang.org/index.p...a_URL_con_Java


Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #5 (permalink)  
Antiguo 12/03/2015, 03:58
 
Fecha de Ingreso: marzo-2014
Mensajes: 9
Antigüedad: 10 años, 9 meses
Puntos: 0
Respuesta: Conseguir ciertos datos de una web.

Cita:
Iniciado por chuidiang Ver Mensaje
Hola:

attern pattern = Pattern.compile("(?i)s*\">\"\s*\"(.*?)\"");
primero que nada gracias, pero esta sentencia me sigue dando error.

Invalid escape sequence.

no nos dejamos algun \ o " ?
Si, ya me lei el link que pusiste, pero son poco entendibles y si no me equivoco son solo para abstraer enlaces, lo que yo quiero extraer es una cadena que este entre xxCONTENIDOyy

donde xy son los delimitadores
  #6 (permalink)  
Antiguo 12/03/2015, 05:51
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 10 años, 4 meses
Puntos: 182
Respuesta: Conseguir ciertos datos de una web.

Buenas,

Cita:
lo que yo quiero extraer es una cadena que este entre xxCONTENIDOyy
Lo que pides es tan sencillo como hacer "xx(.+?)yy"

Por ejemplo, si quieres extraer el contenido dentro de un <h1>.

Pattern pattern = Pattern.compile("<h1>(.+?)</h1>");
Matcher matcher = pattern.matcher("<h1>Este es el contenido a extraer</h1>");
matcher.find();
System.out.println(matcher.group(1));

En cualquier caso, te recomiendo dos cosas:
-Estudiar bien como funcionan las expresiones regulares (porque no siempre van a hacer los demas tu tarea), ya que se utilizan mucho y en todos los lenguajes.
-Si quieres hacer cosas mas avanzadas, utilizar una libreria especializada para parsear contenido HTML, como por ejemplo JSOUP: http://jsoup.org/

Un saludo
__________________
If to err is human, then programmers are the most human of us
  #7 (permalink)  
Antiguo 12/03/2015, 05:53
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 20 años, 2 meses
Puntos: 454
Respuesta: Conseguir ciertos datos de una web.

Cambia \s por \\s

y tienes una s sin \\ delante

De todas formas, para extraer como comentabas desde > hasta </a></h2> no veo por ningún lado en la expresión regular la /a ni el </h2>. Eso de ahí te extraerá lo que haya entre comillas y este precedido por espacios>espacios, es decir, si tienes una cadena

aa > "hola"

te extrerá el hola.

Se bueno.
__________________
Apuntes Java
Wiki de Programación

Última edición por chuidiang; 12/03/2015 a las 06:50
  #8 (permalink)  
Antiguo 12/03/2015, 06:27
 
Fecha de Ingreso: marzo-2014
Mensajes: 9
Antigüedad: 10 años, 9 meses
Puntos: 0
Respuesta: Conseguir ciertos datos de una web.

Cita:
Iniciado por Profesor_Falken Ver Mensaje

Pattern pattern = Pattern.compile("<h1>(.+?)</h1>");
Matcher matcher = pattern.matcher("<h1>Este es el contenido a extraer</h1>");
matcher.find();
System.out.println(matcher.group(1));
recopoilda datos, pero no los que busco.

Mis conocimientos en java no van mas alla de bucles, fuciones y alguna struct.

Pattern pattern = Pattern.compile(">(.+?)</a></h2>");

aqui esta una linea de ejemplo y lo que me gustaria extraer:

Código HTML:
<div class="bloque margen"><a name="p4653"></a><h2><a class="identidad" href="categoria/4653/" title="Limpiar">LO QUE QUIERO SACAR</a></h2> 
lo que me interesa es lo que esta en mayus
  #9 (permalink)  
Antiguo 12/03/2015, 07:17
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 10 años, 4 meses
Puntos: 182
Respuesta: Conseguir ciertos datos de una web.

Buenas,

Por ejemplo:

<a.*>(.+?)</a>

O mas univocamente:
<a.*title=\"Limpiar\">(.+?)</a>

Puedes probar tu mismo las expresiones aqui: http://www.regexplanet.com/ Para usarlo no es necesario realmente saber ni java ni programar.


Un saludo
__________________
If to err is human, then programmers are the most human of us

Última edición por Profesor_Falken; 12/03/2015 a las 07:22
  #10 (permalink)  
Antiguo 13/03/2015, 06:23
 
Fecha de Ingreso: marzo-2014
Mensajes: 9
Antigüedad: 10 años, 9 meses
Puntos: 0
Respuesta: Conseguir ciertos datos de una web.

Cita:
Iniciado por Profesor_Falken Ver Mensaje

O mas univocamente:
<a.*title=\"Limpiar\">(.+?)</a>


Sii, pero limpiar(ya qye esto puede variar) no entraria, entraria solo:

">LO QUE QUIERO SACAR</a></h2>"

he intentado con esto:

(">(.+?)</a></h2>")

pero me salen argumentos desconocidos :S

Última edición por juandqt; 13/03/2015 a las 06:29
  #11 (permalink)  
Antiguo 13/03/2015, 06:48
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 10 años, 4 meses
Puntos: 182
Respuesta: Conseguir ciertos datos de una web.

Y esto no te sirve?

<a.*>(.+?)</a></h2>

Código Java:
Ver original
  1. Pattern pattern = Pattern.compile("<a.*>(.+?)</a></h2>");
  2.         Matcher matcher = pattern.matcher("<div class=\"bloque margen\"><a name=\"p4653\"></a><h2><a class=\"identidad\" href=\"categoria/4653/\" title=\"Limpiar\">LO QUE QUIERO SACAR</a></h2> ");
  3.         matcher.find();
  4.         System.out.println(matcher.group(1));

Al final es solo probar en la herramienta...
http://www.regexplanet.com/advanced/java/index.html

Un saludo
__________________
If to err is human, then programmers are the most human of us
  #12 (permalink)  
Antiguo 13/03/2015, 16:45
 
Fecha de Ingreso: marzo-2014
Mensajes: 9
Antigüedad: 10 años, 9 meses
Puntos: 0
Respuesta: Conseguir ciertos datos de una web.

muchas gracias.. pero me pasa algo totalmente raro. Solo me muestra el ultimo resultado, de los 8 que hay

Código HTML:
private static void showLinks(String content) {

      Pattern pattern = Pattern.compile(">(.+?)</a></h2>");

      Matcher matcher = pattern.matcher(content);
      while (matcher.find()) {
         System.out.println(matcher.group(1));
      }
}
lo tengo asi :S

Última edición por juandqt; 13/03/2015 a las 17:18
  #13 (permalink)  
Antiguo 14/03/2015, 02:28
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 10 años, 4 meses
Puntos: 182
Respuesta: Conseguir ciertos datos de una web.

Buenas,

En ningún momento habías dicho que debías sacar múltiples valores.

Cita:
Pattern pattern = Pattern.compile(">(.+?)</a></h2>");
La expresion que pones en ese ejemplo es incorrecta.


No has aclarado exactamente lo que quieres sacar, así que basándome en el pequeño ejemplo que has puesto antes, mi propuesta sería:

Código Java:
Ver original
  1. String content = "<div class=\"bloque margen\">"
  2.                 + "<a name=\"p4653\"></a><h2>"
  3.                 + "<a class=\"identidad\" href=\"categoria/4653/\" title=\"Limpiar\">"
  4.                 + "LO QUE QUIERO SACAR</a></h2>"
  5.                 + "<div class=\"bloque margen\">"
  6.                 + "<a name=\"p4653\"></a><h2>"
  7.                 + "<a class=\"identidad\" href=\"categoria/4653/\" title=\"Limpiar\">"
  8.                 + "LO QUE QUIERO SACAR 2</a></h2>"
  9.                 + "<div class=\"bloque margen\">"
  10.                 + "<a name=\"p4653\"></a><h2>"
  11.                 + "<a class=\"identidad\" href=\"categoria/4653/\" title=\"Limpiar\">"
  12.                 + "LO QUE QUIERO SACAR 3</a></h2>";
  13.  
  14.         //System.out.println(content);
  15.  
  16.         Pattern pattern = Pattern.compile("<a\\b[^>]*href=\"[^>]*>(.*?)</a></h2>");
  17.  
  18.         Matcher matcher = pattern.matcher(content);
  19.  
  20.         while (matcher.find()) {
  21.             System.out.println(matcher.group(1));
  22.         }

Estúdiate como funcionan las expresiones regulares o todo esto no te habrá servido de nada:
http://docs.oracle.com/javase/tutorial/essential/regex/
http://chuwiki.chuidiang.org/index.p...ulares_en_Java
http://www.mkyong.com/regular-expres...ar-expression/
http://www.javamex.com/tutorials/reg...l#.VQPxy9JwsRk
http://www.vogella.com/tutorials/Jav...s/article.html

Practica aquí:
http://www.regexplanet.com/advanced/java/index.html


Las expresiones regulares son similares y se utilizan en todos los lenguajes. Cuanto antes aprendas como funcionan, mejor.

Si quieres hacer cosas más complejas del tipo HTML scraping, utiliza herramientas más sofisticadas para no reinventar la rueda:

http://jsoup.org/
http://htmlunit.sourceforge.net/


Un saludo
__________________
If to err is human, then programmers are the most human of us
  #14 (permalink)  
Antiguo 16/03/2015, 05:59
 
Fecha de Ingreso: marzo-2014
Mensajes: 9
Antigüedad: 10 años, 9 meses
Puntos: 0
Respuesta: Conseguir ciertos datos de una web.

Vale, volvere a mirarme las expresiones regulares.

ahora pregunto, hay alguna libreria o funcion en java que permita extrar informacion DE CADA linea de texto?
ejemplo

Código HTML:
aaaaBBaaaa
textoderelleno
bbbbCCbbbb
ccccDDccccc
y el resultado por consola me de:
BB
CC
DD

donde BB sea mi variable STRING[0];
CC mi variable STRING[1].. etc

(AA,BB;CC i DD ya lo sacaria yo con las expresiones regulares)

se que con un bucle se podria relizar, pero tendriaque estar diciendo siempre yo cuantos hay: ex anterior tuyo:

Código HTML:
String content = "<div class=\"bloque margen\">"
                + "<a name=\"p4653\"></a><h2>"
                + "<a class=\"identidad\" href=\"categoria/4653/\" title=\"Limpiar\">"
                + "LO QUE QUIERO SACAR</a></h2>"
                + "<div class=\"bloque margen\">"
                + "<a name=\"p4653\"></a><h2>"
                + "<a class=\"identidad\" href=\"categoria/4653/\" title=\"Limpiar\">"
                + "LO QUE QUIERO SACAR 2</a></h2>"
                + "<div class=\"bloque margen\">"
                + "<a name=\"p4653\"></a><h2>"
                + "<a class=\"identidad\" href=\"categoria/4653/\" title=\"Limpiar\">"
                + "LO QUE QUIERO SACAR 3</a></h2>";
y si la pagina de referencia decide añadir mas campos de informacion? mi sistema solo pillaria 3(con el ejemplo)

no ven que no seria del todo eficiente?
  #15 (permalink)  
Antiguo 16/03/2015, 06:27
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años, 7 meses
Puntos: 306
Respuesta: Conseguir ciertos datos de una web.

Las expresiones regulares existen porque esas búsquedas son tan variables que es necesario usar algo flexible que se adapte a nuestras necesidades.

Te han señalado el camino y puesto algunos ejemplos, ahora deberías tú trabajar un poco sobre ello para que se adapte a lo que necesitas.

Si tienes un texto en líneas, ¿para qué necesitas una librería o saber cuantas líneas hay? Aplicas la búsqueda a cada línea que exista y ya, con las listas dinámicas no necesitas saber cuántos campos hay, los que cumplan los coges.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #16 (permalink)  
Antiguo 16/03/2015, 06:40
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 10 años, 4 meses
Puntos: 182
Respuesta: Conseguir ciertos datos de una web.

Buenas,

Si realmente miras las expresiones regulares y los tutoriales que te has pasado veras que el simbolo '$' equivale a un salto de linea.
Con esa informacion, leyendo y practicando un rato no te sera dificil sacar la expresion que necesitas.


Un saludo
__________________
If to err is human, then programmers are the most human of us

Etiquetas: ciertos, conseguir
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:05.