• Publicidad

Extracción de Información

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Extracción de Información

Notapor _PePa_ » 2007-06-11 10:46 @490

Hola, soy nueva en este foro, y también nueva en Perl. Os expongo un poco el problema: De una página web, bueno, de varias, tengo que extraer toda la información referente a restaurantes, bueno, en concreto, de restaurantes de jaén, y de las páginas tengo que extraer la siguiente información: Nombre Restaurante + Dirección. Todo parece demasiado fácil, pero en realidad no me lo está pareciendo. Bueno tras descargar las páginas web desde Java, con un parser, le quito todas las etiquetas al código fuente de la página, quedando por ejemplo así:

Código: Seleccionar todo
<DOC>
<DOCNO> 2 </DOCNO>
Restaurantes en Jaén
RESTAURANTES DE ESPAÑA
Restaurantes en Jaen
LOS MEJORES RESTAURANTES DE JAEN
Buscar Restaurantes: RESTAURANTES EN Restaurantes Álava Restaurantes Albacete Restaurantes Alicante Restaurantes Almería Restaurantes Asturias Restaurantes Ávila Restaurantes Badajoz Restaurantes Baleares Restaurantes Barcelona Restaurantes Burgos Restaurantes Cáceres Restaurantes Cádiz Restaurantes Cantabria Restaurantes Castellón Restaurantes Ciudad Real Restaurantes Córdoba Restaurantes A Coruña Restaurantes Cuenca Restaurantes Girona Restaurantes Granada Restaurantes Guadalajara Restaurantes Guipúzcoa Restaurantes Huelva Restaurantes Huesca Restaurantes Jaen Restaurantes Las Palmas Restaurantes León Restaurantes Lleida Restaurantes Lugo Restaurantes Madrid Restaurantes Málaga Restaurantes Murcia Restaurantes Navarra Restaurantes Ourense Restaurantes Palencia Restaurantes Pontevedra Restaurantes La Rioja Restaurantes Salamanca Restaurantes S.C. Tenerife Restaurantes Segovia Restaurantes Sevilla Restaurantes Soria Restaurantes Tarragona Restaurantes Teruel Restaurantes Toledo Restaurantes Valencia Restaurantes Valladolid Restaurantes Vizcaya Restaurantes Zamora Restaurantes Zaragoza
La Abadia - Restaurantes en Jaén
Asador La Abadia, Restaurantes en Jaén, cocina andaluza tradicional con toques de vanguardia empleando espumas, gelatinas calientes, cremosos, crujientes... Recomendamos sus revueltos, la presa ibérica, y sus carnes de buey.
Dirección: Melchor Cobo Medina 19 Jaen Ver Web
La Gondola - Restaurantes en Jaén
Asador La Gondola, Restaurantes en Jaén, Una cocina tradicional y nutritiva que es posible gracias al mejor aceite de oliva, y elaborada a base de productos naturales de máxima calidad; una gastronomía de corte Renacentista en la que disfrutarás, entre otras muchas especialidades, de sus exquisitos Asados al Horno al Estilo Castilla regados con una selectísima carta de vinos.
Dirección: Portales Carbonerías 13 Baeza Jaen Ver Web
Paquito Diaz - Restaurantes en Jaén
Restaurante Paquito Diaz , Restaurantes en Jaén, restaurante palaciego en pleno casco histórico de Baeza Jaen. En su cocina Raul Clemente mezcla esos sabores y olores que tan buenos momentos nos ha hecho pasar. Recomendamos El secreto de cerdo ibérico con huevos.
Dirección: Enrique Moreno, 12 Baeza Jaén Ver Web
La Mesa Segureña - Restaurantes en Jaén
Restaurante La Mesa Segureña, Restaurantes en Jaén, podrá degustar una serie de platos de gastronomía serrana y de creación propia, regados con una sugestiva carta de vinos, dentro de un ambiente muy acogedor. La decoración del comedor, contribuye a crear un clima de confort y exclusividad, sin renunciar a los materiales y colores de la arquitectura de Segura de la Sierra
Dirección: Postigo, 2 · Segura de la Sierra · Jaén Ver Web
Torre de los Llanos - Restaurantes en Jaén
Restaurante Torre de los Llanos, Restaurantes en Jaén, empresa dedicada a la celebraciones sociales como bodas, bautizos, comuniones y reuniones de empresa, y para ello cuentan con varios salones con un aforo de mas de 850 personas. El menu medio de un banquete de bodas es de 60 € realizando ofertas de menús todos los meses, y cambiandolos dependiendo de la temporada.
Dirección: Avda. de los Llanos 4 Torredelcampo · Jaén Ver Web
Mesones 14 - Restaurantes en Jaén
Restaurante Mesones 14, Restaurantes en Jaén, Local acogedor en el centro de Jaén donde podrá degustar especialidades como la carrillada y presa de cerdo ibérico, magret de pato, revueltos variados como los de habas con morcilla y ahumados, de postre leche frita. Restaurante barato y de calidad. Tiene menús para grupos.
Dirección: C/ Federico Mendizábal, 14 · Jaén Ver Web
Guía de Restaurantes. Los mejores restaurantes de Jaén
Restaurantes en
Alava
Las Palmas
Albacete
La Rioja
Alicante
Leon
Almeria
Lleida
Asturias
Lugo
Avila
Madrid
Badajoz
Malaga
Baleares
Murcia
Barcelona
Navarra
Burgos
Ourense
Caceres
Palencia
Cadiz
Pontevedra
Cantabria
Salamanca
Castellon
S.C. Tenerife
Ciudad Real
Segovia
Cordoba
Sevilla
A Coruña
Soria
Cuenca
Tarragona
Girona
Teruel
Granada
Toledo
Guadalajara
Valencia
Guipuzcoa
Valladolid
Huelva
Vizcaya
Huesca
Zamora
Jaén
Zaragoza
Por Continente: África América del Norte América Central América del Sur Ásia Europa Oceania -------------
Restaurantes cerca de Jaén
Restaurantes en Jaén
Restaurantes en Granada
Restaurantes en Córdoba
Restaurantes en Ciudad Real
Restaurantes en Albacete
Copyright © 2006 - unrestaurante.com. Guía de Restaurantes Todos los derechos reservados.
</DOC>


Yo tenía hecho esta extracción de información, con un programa en C, que tenía varias deficiencias, y ayudándome de un fichero de palabras con sinónimos de restaurante (distinguiendo entre mayúsculas y minúsculas) y otro de direcciones (calle, C/, Avenida, etc).

Contenido del fichero de "palabras"
Código: Seleccionar todo
RESTAURANTE
RESTAURANTES
Restaurante
Restaurantes
restaurante
restaurantes
restaurant
Restaurant
SALON
SALONES
Salon
Salones
salon
salones
CASA
Casa
casa
ASADOR
Asador
asador
COMPLEJO
Complejo
complejo
MESON
Meson
meson
MESONES
Mesones
mesones
CASER
caser
Caser
Casería
Caseria
caseria
casería


Contenido del fichero de "direcciones"
Código: Seleccionar todo
DIRECC
Direcc
direcc
Dirección
dirección
DIRECCIÓN
Dirección:
dirección:
DIRECCIÓN:
CRTA
Crta
crta
CARRETERA
Carretera
carretera
PLAZA
Plaza
plaza
PZA.
Pza.
pza.
PZA
Pza
pza
AVDA
Avda
avda
AVDA.
Avda.
avda.
AVENIDA
Avenida
avenida
C/
c/
CALLE
Calle
calle
PASEO
Paseo
paseo
Ctra
ctra
CTRA
AUTOVIA
Autovia
autovia
Autopista
AUTOV.
Autov.
autov.


Ahora, tengo que hacer esto en Perl, y estoy bastante perdida.
¿Alguien podría echarme un mano?

El resultado esperado, tras ejecutar el programa en Perl, sería:
Código: Seleccionar todo
Restaurante: La Abadía
Dirección: Melchor Cobo Medina 19 Jaen

Restaurante: La Góndola
Dirección:Portales Carbonerías 13 Baeza Jaen


etc, etc.
_PePa_
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2007-06-11 10:29 @478

Publicidad

Notapor _PePa_ » 2007-06-11 10:52 @494

Lo que hacía en mi programa en C era lo siguiente:
Leía del fichero línea a línea, examinaba cada una de las líneas y si me encontraba con alguna palabra que coincidiese con el fichero de "palabras" entonces buscaba hasta encontrarme una dirección. Si leía once o doce líneas, tras encontrar un "restaurante", y no encontraba ninguna dirección, eliminaba el restaurante y empezaba a leer de fichero desde el último restaurante encontrado.

Problema 1: que había nombre de restaurantes que no coincidían con la dirección.

Problema 2: que en la dirección no viniese ninguna de las palabras del fichero direcciones, sino directamente el nombre de la calle y el número.

Problema 3: que apareciese primero la dirección y posteriormente el nombre del restaurante.
_PePa_
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2007-06-11 10:29 @478

Notapor explorer » 2007-06-11 11:29 @520

El problema es muy bonito y yo creo que se puede resolver en una docena de líneas con la ayuda del módulo HTML::TableExtract.

Pero lo más importante es la cuestión legal: en la página http://www.unrestaurante.com/infor/legal.html , apartado 2, dice que no se puede copiar la información de esas páginas. Si no cuentas con el permiso de los dueños, te puedes meter en un lío.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor _PePa_ » 2007-06-11 11:40 @528

Gracias por contestar.

En cuanto a la legalidad, lo estuve leyendo y lo que tengo que hacer es para unas prácticas de la carrera, que no es para fines publicitarios ni comerciales, es para una aplicación Java de extracción de información, no es siquiera una página web, ni se subirá a Internet. es una aplicación local.

¿Me podrías orientar un poco, en cuanto a cómo podría hacerlo? Soy totalmente nueva en Perl y estoy un pelín perdida. Estoy leyendo manuales y tutoriales y voy entendiendo algunas cosas.

¡Gracias de antemano!
_PePa_
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2007-06-11 10:29 @478

Notapor explorer » 2007-06-11 12:19 @555

Bienvenida a los foros de Perl en Español.

Te he movido el tema al foro Básico, ya que en el de Experto poca ayuda vas a recibir, si estás aprendiendo.

Estoy alucinando con lo de hacer una aplicación Java y usar Perl para extraer la información. Lo ideal es usar un solo lenguaje. ¿Por qué?

En Perl puedes usar muchos módulos (librerías) que te pueden ayudar a extraer información de la página web, pero, según he visto, la extracción casi se podría resolver leyendo el fichero línea a línea. Digo casi porlas excepciones que comentas. En la página de Jaén que he descargado, no las he visto, por lo que no puedo hacerme una idea clara de ellas. Ya veremos otras.

La extracción línea a línea veo que se puede hacer relativamente fácil porque los nombres y direcciones de los restaurantes siguen el mismo patrón.

Luego te doy más pistas.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor _PePa_ » 2007-06-11 15:40 @694

Hola, te comento un poco. La aplicación se comenzó en Java, de hecho he usado las librerías de Java: htmlparser, para quitar todas las etiquetas de html. Lo que ahora intento hacer en Perl, lo tengo hecho ya, pero claro, si por ejemplo tengo:
Código: Seleccionar todo
....
restaurantes en Jaén
restaurantes en España
Asador la Abadía
....
Dirección: calle ejemplo 1
.....

leo la primera línea y voy comparando palabra a palabra con mi fichero de palabras, al encontrar la palabra "restaurante", busco en las siguientes líneas, la palabra "dirección", también comparando palabra a palabra con el fichero de direcciones, con lo cual lo que obtengo como resultado es:
Restaurante: restaurantes en Jaén
Dirección: calle ejemplo 1

Me comentaron que Perl era mucho más potente y que además se trabajaba con expresiones regulares y patrones; es por eso la idea de usar Perl y poder solucionar este problema.

Gracias por la ayuda.
_PePa_
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2007-06-11 10:29 @478

Notapor _PePa_ » 2007-06-11 15:42 @696

¡Ah! otra cosa. Te he mandado solo un fichero resultado después de quitar las etiquetas, pero el problema también viene ya que en todas las páginas que obtengo como resultado, no se siguen los mismos patrones, aunque en la mayoría sí.
_PePa_
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2007-06-11 10:29 @478

Notapor explorer » 2007-06-11 16:26 @726

Bueno... la primera pista es mostrarte algo muy peculiar: con Perl, se puede resolver tu problema en una sola línea:

Código: Seleccionar todo
explorer@portatil:~/Documents/Desarrollo> perl -nle '/bodyText">([^<]*?)[ ,]*<(?:b|strong)/ and print $1; / *(Direcci.+) \&nbsp/ and print $1 and print "";' jaen.html
Asador La Abadia
Dirección: Melchor Cobo Medina 19 Jaen

Asador La Gondola
Dirección: Portales Carbonerías 13 Baeza Jaen

Restaurante Paquito Diaz
Dirección: Enrique Moreno, 12 Baeza Jaén

Restaurante La Mesa Segure&ntilde;a
Dirección: Postigo, 2 · Segura de la Sierra · Jaén

Restaurante Torre de los Llanos
Dirección: Avda. de los Llanos 4 Torredelcampo · Jaén

Restaurante Mesones 14
Dirección: C/ Federico Mendizábal, 14 · Jaén

explorer@portatil:~/Documents/Desarrollo>


Explicación:
* La página con los restaurantes de Jaén la tenemos guardada en el fichero jaen.html.
* Ejecutamos perl desde la línea de comandos, con las opciones '-nle' que tienen los siguientes efectos:
  • '-n' hace leer cada línea del fichero de entrada, se la pasa al programa en la variable $_ y no la pinta al final (pintaremos nosotros nuestras propias salidas).
  • '-l' hace imprimir un retorno de carro en todos los print.
  • '-e' indica que lo que sigue es el programa.
* El programa consta de dos líneas. Cada línea comienza por una expresión regular. Si la expresión regular coincide con la línea que recibimos del fichero, por medio de los 'and' se ejecutan el resto de expresiones de las líneas.
* La primera línea busca por el patrón /bodyText">([^<]*?)[ ,]*<(?:b|strong)/, que quiere decir: busca por el texto bodyText">, seguido por una serie de caracteres que no son '<', seguidos por uno o más caracteres comas o espacios blancos, seguidos por un '<' y seguidos finalmente por una 'b' o por un 'strong'. En caso de que la línea coincida con ese patrón, nos quedamos, con la ayuda de los paréntesis de captura, con el texto que nos interesa (el que está en el interior de las marcas HTML).
* Si esta primera parte se cumple, el 'and' ejecuta la segunda parte. print $1 imprime en la pantalla el valor de $1, que contiene lo capturado por el primer par de paréntesis de la expresión regular.
* La segunda línea busca por el patrón / *(Direcci.+) \&nbsp/, que busca cero o más espacios en blanco y un texto que nos interesa guardar: la palabra Direcci y algo más, hasta que aparece el texto &nbsp;.
* En caso de que se cumpla lo anterior, se ejecutan dos print. El primero para imprimir el texto capturado por el primer par de paréntesis de captura de la expresión regular anterior, y el segundo, no pinta nada, pero su efecto, gracias al '-l' es que aparece una línea en blanco más.

Esta es una forma de hacerlo. Hay muchas más.
El siguiente programa hace exactamente lo mismo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

while ( my $linea = <> ) {

    if ( $linea =~ m/bodyText">([^<]*?)[ ,]*<(?:b|strong)/ ) {
        print "$1\n";
    }
    elsif ( $linea =~ m/ *(Direcci.+) \&nbsp/ ) {
        print "$1\n\n";
    }
}
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4
La solución ha sido sencilla porque el fichero a tratar tenía una estructura fija y conocida. Si es fija, podemos usar expresiones regulares para extraer la información.

Pues sí... Perl es muy potente.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor _PePa_ » 2007-06-11 16:48 @742

Muchísimas gracias, por tu ayuda. Voy a echarle un vistazo al código y a hacer pruebas y digerirlo todo, jeje.

Seguiré probando y si me salen más dudas, ¡creo que no voy a dudar en preguntártelas!

Muchas gracias, de nuevo, ¡ni te imaginas lo que me ha ayudado!
_PePa_
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2007-06-11 10:29 @478


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados