• Publicidad

Grep en web

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

Grep en web

Notapor joss » 2007-10-03 12:53 @578

Lo que estoy intentado hacer es entrar en una web y buscar una palabra mediante grep. Y si existe que me lo confirme.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use IO::Socket::INET;
$sock = IO::Socket::INET->new(PeerAddr => "www.google.es", PeerPort => 80, Proto => "tcp");

$grep= "$sock | grep Web";

if($grep == 0)  {

    print "NO EXISTE\n";
}
else {
    print "EXISTE\n";
}
Coloreado en 0.006 segundos, usando GeSHi 1.0.8.4


Con ese script estoy intentando entrar a google y si me encuentra la palabra "Web" que me imprima "EXISTE". Pero ese code está mal.
joss
Perlero Nuevo
Perlero Nuevo
 
Mensajes: 36
Registrado: 2007-09-10 13:04 @586

Publicidad

Notapor explorer » 2007-10-03 12:59 @583

Con IO::Socket haces la conexión, si... pero no estás haciendo la petición HTTP.

Te aconsejo que uses el paquete LWP. Mírate los ejemplos de lwpcook.
JF^D Perl Programming Language
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 12879
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor explorer » 2007-10-03 13:09 @589

Copiado del lwpcook:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use LWP::Simple;
$doc = get 'http://www.google.es';
if ( $doc =~ m/ Web /mosix ) {
    print "EXISTE\n";
}
else {
    print "NO EXISTE\n";
}
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4
JF^D Perl Programming Language
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 12879
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor joss » 2007-10-04 12:40 @570

Estoy intentando hacer algo más complicado ... Un script que te pida la URL de una web mediante argumentos... y después tu le metes desde el mismo programa parte de esa URL y que después haga el grep:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$host=$ARGV[0];

print "$host";

$comando=<STDIN>;

print "Comando injectado: $comando\n";

$doc = get '$host . $comando';

if ( $doc =~ m/ Web /mosix ) {
    print "EXISTE\n";
}
else {
    print "NO EXISTE\n";
}
Coloreado en 0.006 segundos, usando GeSHi 1.0.8.4



Un ejemplo es:

Código: Seleccionar todo
argumento ==> www.localhost.com/index.asp?id=
comando ==> 72

Doc ==> www.localhost.com/index.asp?id=72


y después que haga el grep en esa url y si encuentra la palabra a buscar que lo diga... pero la cuestión es que está la palabra y me dice que no existe.
joss
Perlero Nuevo
Perlero Nuevo
 
Mensajes: 36
Registrado: 2007-09-10 13:04 @586

Notapor kidd » 2007-10-04 12:52 @578

Haciendo unos pequeños cambios en el código vas a conseguir lo que quieres:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$host=$ARGV[0];

print "$host";

$comando=<STDIN>;

chomp $comando;

print "Comando injectado: $comando\n";

$doc = get($host . $comando);

if ( $doc =~ m/ Web /mosix ) {
    print "EXISTE\n";
}
else {
    print "NO EXISTE\n";
}
Coloreado en 0.006 segundos, usando GeSHi 1.0.8.4


Saludos
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1165
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Notapor joss » 2007-10-04 13:38 @609

Ya me funcionó. Pero me es muy vergonzoso preguntar cada problema que se me planteé... estoy buscando un manual que me explique la estructura a seguir en cada caso. Por ejemplo yo puse:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$doc = get '$host . $comando';
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4

y por comerme unos simples paréntesis ya no me funcionó el código:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$doc = get($host . $comando);
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


Mirad como estoy con el código:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$host=$ARGV[0];

print "$host";

$comando=<STDIN>;

chomp $comando;

if ($comando =~ s/ /+/g) {
    print "Comando injectado: $comando\n";

    $doc = get ($host . $comando);

    if ( $doc =~ m/ Web /mosix ) {
        print "EXISTE\n";
    }
    else {
        print "NO EXISTE\n";
    }

} # fin del if del comando
Coloreado en 0.006 segundos, usando GeSHi 1.0.8.4


Le añadí:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if ($comando =~ s/ /+/g)
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


Para que todos los espacios que haya en el comando se cambien por un +, para evitar errores.

Pero aún sigo queriendo hacer una cosa, por ejemplo si a mi me busca en la web la palabra "Web" , quiero que me imprima todo el párrafo que le prosigue.

Ejemplo: La web está muy bien.

Pues si el script encuentra la palabra web que imprima todo lo que le sigue, quedaría así: web está muy bien.

Pero no tengo ni idea por dónde empezar para hacer eso.
joss
Perlero Nuevo
Perlero Nuevo
 
Mensajes: 36
Registrado: 2007-09-10 13:04 @586

Notapor kidd » 2007-10-04 14:44 @656

Muy bien, ya estamos hablando una cosa algo diferente, lo primero sería ¿qué consideras como un párrafo dentro de la página? ¿Cada línea separada? ¿Un bloque dentro de los tags de párrafo <p>?

Te podríamos ayudar más si pones un ejemplo de la página que estás leyendo y a base de ello el resultado que quisieras encontrar de ella.

Como comentario del código que tienes ahora, debes de hacer la sustitución sin el if, de lo contrario, si tu variable $comando no contiene espacios entonces se saltará por completo el bloque del if, y supongo que no deseas este comportamiento.
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1165
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Notapor joss » 2007-10-04 14:56 @664

Me refiero a un <p> en HTML. Ejemplo:

Código: Seleccionar todo
<<Comienzo>>

blablablablablablablablablablablablablablablablablablablablablablablabla
blablablablablablablablablablablabla.

<<FIn>>

blablablablablablablablablablablablablablablablablablablabla.


Respecto a los del if, ¿cómo podría cambiar los 'espacios' por '+' de otra forma a la que he puesto?
joss
Perlero Nuevo
Perlero Nuevo
 
Mensajes: 36
Registrado: 2007-09-10 13:04 @586

Notapor explorer » 2007-10-04 18:01 @792

No fueron los paréntesis lo que falló. El fallo estuvo en usar comillas simples.

La regla es fácil: si hay comillas simples, no hay interpolación de variables.

Así que la línea
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$doc = get '$host . $comando';
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4
hacía justo eso: almacenaba en $doc la cadena de caracteres literal que habías pasado: $host . $comando.

En cuanto al tema de los espacios: haces correctamente la sustitución con el s///, pero, ¿por qué (if) necesitas preguntar si lo ha hecho?

Es cuestión de lógica del programa saber el por qué pones la sustitución como una condición, si no quieres que sea una condición. Si quieres que sea solo una sustitución, te sobra la condición.
JF^D Perl Programming Language
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 12879
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor kidd » 2007-10-05 09:23 @432

En primer lugar, como decía explorer, para quitar los espacios sin tener que usarlo como condicional, simplemente quitas el if y pones la línea:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$comando =~ s/ /+/g
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


Ahora, aún sigo sin ver el HTML que necesitas leer y parsear, por lo que creo que tienes dos opciones.

1. Usar el módulo HTML::Parser y sacar todos los <p> de tu HTML y luego realizar la búsqueda con el regexp en cada uno de ellos.

2. Si el código de tu HTML está exactamente como me pones en el ejemplo y cada párrafo está divido por dos saltos de línea '\n\n', entonces podrías hacer algo así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$host=$ARGV[0];

print "$host";

$comando=<STDIN>;

chomp $comando;

$comando =~ s/ /+/g;

print "Comando injectado: $comando\n";

$doc = get ($host . $comando);

#dividir por párrafos
my @parrafos = split /\n\n/, $doc;

for my $parrafo( @parrafos ){

    if ( $parrafo =~ m/ Web /mosix ) {
        print "EXISTE - $parrafo\n";
    }
    else {
        print "NO EXISTE\n";
    }

}
Coloreado en 0.006 segundos, usando GeSHi 1.0.8.4



Pero nuevamente, se te podría dar una respuesta más acertada si podemos ver el código del HTML que deseas parsear.

Saludos
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1165
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Siguiente

Volver a Básico

¿Quién está conectado?

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