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

Editar cuerpo de un HTML ??

Estas en el tema de Editar cuerpo de un HTML ?? en el foro de Programación General en Foros del Web. hola, estoy buscando un script que me seleccione el cuerpo de un archivo html y que busque si hay texto del mismo color del fondo(bgcolor), ...
  #1 (permalink)  
Antiguo 16/06/2005, 10:10
 
Fecha de Ingreso: diciembre-2004
Mensajes: 59
Antigüedad: 19 años, 4 meses
Puntos: 0
Editar cuerpo de un HTML ??

hola, estoy buscando un script que me seleccione el cuerpo de un archivo html y que busque si hay texto del mismo color del fondo(bgcolor), y me lo deje en un color neutro. esto es para evitar una tecnica de spam muy efectiva

Alguna idea ??

Salu2.
  #2 (permalink)  
Antiguo 16/06/2005, 10:32
Avatar de monoswim
$moderador{'Esteban'}
 
Fecha de Ingreso: febrero-2002
Ubicación: Buenos Aires - Argentina
Mensajes: 8.762
Antigüedad: 22 años, 3 meses
Puntos: 90
No conozco ningún script, pero no sería muy complicado programarlo...

Supongamos que tememos el HTML en una variable

$string_html;

#Le sacamos los saltos de línea para trabajar más cómodos
$string_html =~ s/\n//g;

#tomamos el código que hay entre <body> y </body> con su contenido y atributos

my ($atributos,$contenido) = $html_string =~ m#<body (.*?)>(.*?)</body>#;

luego es cuestión de procesar el $atributos y el $contenido...

Espero que te sirva

Saludos
__________________
Esteban Quintana
  #3 (permalink)  
Antiguo 16/06/2005, 20:53
 
Fecha de Ingreso: diciembre-2004
Mensajes: 59
Antigüedad: 19 años, 4 meses
Puntos: 0
gracias, me es muy util

aprovecho de preguntar, si lo que esta en este post: http://www.forosdelweb.com/showpost....8&postcount=43 sirve para capturar el texto entre los tags

si sirve, entonces el comienzo lo dejo igual, lo entre <body> uso lo dicho y "reseteo" los colores, y el resto se queda igual tb
  #4 (permalink)  
Antiguo 17/06/2005, 09:40
Avatar de monoswim
$moderador{'Esteban'}
 
Fecha de Ingreso: febrero-2002
Ubicación: Buenos Aires - Argentina
Mensajes: 8.762
Antigüedad: 22 años, 3 meses
Puntos: 90
Si, ese post explica como hacer para buscar el contenido del tag, pero no te puse ese porque además del contenido necesitás los atributos de la etiqueta, porque sino no podés saber cual es el fondo de la página...

Recordá que tendrás algo así como

<body bgcolor="#006699">texto</body>

Se entiende ?

Saludos
__________________
Esteban Quintana
  #5 (permalink)  
Antiguo 17/06/2005, 11:06
 
Fecha de Ingreso: diciembre-2004
Mensajes: 59
Antigüedad: 19 años, 4 meses
Puntos: 0
disculpen la ignorancia, pero no se como meter el archivo a un string.

si tengo esto:

open(archivo,"<texto.html") || die "$!";
open(html,">texto.html.spam") || die "$!";

@string=<archivo>

ahi el archivo queda en un array, pero como hago para meterlo al string unico($string_html) ?.

seria usando algo como esto: while(<archivo>){
  #6 (permalink)  
Antiguo 17/06/2005, 12:22
Avatar de monoswim
$moderador{'Esteban'}
 
Fecha de Ingreso: febrero-2002
Ubicación: Buenos Aires - Argentina
Mensajes: 8.762
Antigüedad: 22 años, 3 meses
Puntos: 90
Hola, primero que nada estás abriendo dos veces el archivo, uno de modo lectura < y otro de modo escritura >

Para cargarlo en un string podrías hacer algo así como
Código:
my $tot = '';
open(TEMPLATE,"<file.html");
while (my $linea = <TEMPLATE>){
   $tot .= "$linea";
}
close (TEMPLATE);
Espero que te sirva

Saludos
PD: Otra forma sería cargar todo en el array y luego con la función join guardarlo todo en un string...Fijate que en perlenespanol.com tenés un tutorial de como usar join y split...
__________________
Esteban Quintana
  #7 (permalink)  
Antiguo 17/06/2005, 20:03
 
Fecha de Ingreso: diciembre-2004
Mensajes: 59
Antigüedad: 19 años, 4 meses
Puntos: 0
Cita:
Hola, primero que nada estás abriendo dos veces el archivo, uno de modo lectura < y otro de modo escritura >
es que este script debe abrir por ejemplo, xxx.html y debe salir el texto corregido en el archivo xx.html.spam

Cita:
PD: Otra forma sería cargar todo en el array y luego con la función join guardarlo todo en un string...Fijate que en perlenespanol.com tenés un tutorial de como usar join y split...
SI ¡¡, precisamente fue eso lo primero que intente hacer, pero no me dio resultados , lo re-intentare, junto a lo que me acabas de decir.

Nuevamente gracias
  #8 (permalink)  
Antiguo 17/06/2005, 20:10
Avatar de monoswim
$moderador{'Esteban'}
 
Fecha de Ingreso: febrero-2002
Ubicación: Buenos Aires - Argentina
Mensajes: 8.762
Antigüedad: 22 años, 3 meses
Puntos: 90
Haaa, perfecto, bueno, espero que te salga...

Cualquier cosa ya sabés...

Saludos
__________________
Esteban Quintana
  #9 (permalink)  
Antiguo 17/06/2005, 20:12
 
Fecha de Ingreso: diciembre-2004
Mensajes: 59
Antigüedad: 19 años, 4 meses
Puntos: 0
luego de un aprendizaje muy rapido en la pagina recomdada, tengo esto por el momento:

Cita:
#!/usr/bin/perl

open(archivo,"<texto.html") || die "$!";
open(html,">texto.html.spam") || die "$!";

@string=<archivo>;
my $string_html = join("/n", @string);


#Le sacamos los saltos de línea para trabajar más cómodos
$string_html =~ s/\n//g;

#tomamos el código que hay entre <body> y </body> con su contenido y atributos (no entiendo que hace)

my ($atributos,$contenido) = $html_string =~ m#<body (.*?)>(.*?)</body>#;

print $atributos; #para aprender que hace (salida 0 por ahora)
print $contenido; #para aprender que hace (salida 0 por ahora)
print $string_html; #sale todo, sin embargo veo aun /n (que raro)

close(txt);
close(html);
creo que no estoi tan perdido por ahora
  #10 (permalink)  
Antiguo 19/06/2005, 11:48
 
Fecha de Ingreso: diciembre-2004
Mensajes: 59
Antigüedad: 19 años, 4 meses
Puntos: 0
me falto decir que la salida del html debe ser igual a la original, solo cambiando los caracteres o links ocultos, asi que no se puede eliminar los saltos de linea para trabajar mas comodo.

tb quiero preguntar en esta linea

Cita:
my ($atributos,$contenido) = $html_string =~ m#<body (.*?)>(.*?)</body>#;
esa es una variable nueva, porque el html esta guardado en string_html, no se si sea un error, porque he probado con varios archivos y atributos y contenido siempre quedan en blanco.

gracias por las respuestas
  #11 (permalink)  
Antiguo 19/06/2005, 19:57
Avatar de monoswim
$moderador{'Esteban'}
 
Fecha de Ingreso: febrero-2002
Ubicación: Buenos Aires - Argentina
Mensajes: 8.762
Antigüedad: 22 años, 3 meses
Puntos: 90
my ($atributos,$contenido) = $html_string =~ m#<body (.*?)>(.*?)</body>#;

lo que hace es buscar en la variable $html_string la información quue hay en la etiqueta body, tango los atributos como el contenido..., si no te devuelve nada puede ser que lo escribas con mayúsculas en vez de minúsculas...

Checkea eso

Saludos
__________________
Esteban Quintana
  #12 (permalink)  
Antiguo 19/06/2005, 20:36
 
Fecha de Ingreso: diciembre-2004
Mensajes: 59
Antigüedad: 19 años, 4 meses
Puntos: 0
pero $html_string no existe, la variable que existe es:

Cita:
Supongamos que tememos el HTML en una variable

$string_html;
o estoy mal ??
  #13 (permalink)  
Antiguo 20/06/2005, 06:47
Avatar de monoswim
$moderador{'Esteban'}
 
Fecha de Ingreso: febrero-2002
Ubicación: Buenos Aires - Argentina
Mensajes: 8.762
Antigüedad: 22 años, 3 meses
Puntos: 90
jeje...le di vuelta el nombre...

Saludos
__________________
Esteban Quintana
  #14 (permalink)  
Antiguo 20/06/2005, 15:32
 
Fecha de Ingreso: diciembre-2004
Mensajes: 59
Antigüedad: 19 años, 4 meses
Puntos: 0
ya la cambie, pero no funciona

me he leido todos los tutoriales que existen de expresiones regulares, y sigo sin entender parte de la funcion

my ($atributos,$contenido) = $html_string =~ m#<body (.*?)>(.*?)</body>#;

el ~m y los #, para que sirven en este caso ??
  #15 (permalink)  
Antiguo 20/06/2005, 17:38
Avatar de monoswim
$moderador{'Esteban'}
 
Fecha de Ingreso: febrero-2002
Ubicación: Buenos Aires - Argentina
Mensajes: 8.762
Antigüedad: 22 años, 3 meses
Puntos: 90
El ~ indica que estamos trabajando con una expresión regular, nada más que eso, ahora el ## indican el comienzo y el final de la expresión regular, es más común colocar / en vez de # pero es opcional en perl así que colocá lo que desees...

el m significa que debe buscar lo que nosotros coloquemos en nuestar expresión regular y devolver lo que le digamos, que en este caso es lo que hay entre <body y > y lo que hay entre > y </body>

Se entiende un poco más ahora ?

Saludos
__________________
Esteban Quintana
  #16 (permalink)  
Antiguo 20/06/2005, 18:28
 
Fecha de Ingreso: diciembre-2004
Mensajes: 59
Antigüedad: 19 años, 4 meses
Puntos: 0
CLARISIMO

lo raro que al cambiar las # por /, como es mas popular (por eso no entendia), me sale error del programa

Cita:
Bareword found where operator expected at tarea3.pl line 15, near "m/<body(.*?)>
(.*?)</body"
syntax error at tarea3.pl line 15, near "m/<body(.*?)>(.*?)</body"
Search pattern not terminated at tarea3.pl line 15.
que raro, será que hay un error en la expresion y estaba tomando los # como comentarios

gracias por la paciencia :)
  #17 (permalink)  
Antiguo 20/06/2005, 19:27
Avatar de monoswim
$moderador{'Esteban'}
 
Fecha de Ingreso: febrero-2002
Ubicación: Buenos Aires - Argentina
Mensajes: 8.762
Antigüedad: 22 años, 3 meses
Puntos: 90
No, claro, lo cambié porque sino no podés usar el </body, ya que se piensa que esa barra es la del fin de la expresión e intenta ejecutar body" y obviamente genera un error...

Ahora me acuerdo que esa era razón por la cual la había cambiado...jeje

Saludos
__________________
Esteban Quintana
  #18 (permalink)  
Antiguo 20/06/2005, 20:15
 
Fecha de Ingreso: diciembre-2004
Mensajes: 59
Antigüedad: 19 años, 4 meses
Puntos: 0
Realmente muy agradecido. Efectivamente no funcionaba primero por el archivo html que le estaba dando, y segundo por lo de las mayusculas, asi que haciendo un pequeño cambio funciona para la mayoria de los casos:

my ($atributos,$contenido) = $string_html =~m#<body(.*?)>(.*?)</body>#i;

ahora me queda hacer que si contenido tiene lo encontrado en atributos, cambiar el color a uno neutro. Cuando termine el codigo lo pondre aca, a ver si le sirve a alguien mas y espero terminarlo pronto :P

muchas gracias nuevamente
  #19 (permalink)  
Antiguo 20/06/2005, 21:12
 
Fecha de Ingreso: diciembre-2004
Mensajes: 59
Antigüedad: 19 años, 4 meses
Puntos: 0
aca esta el codigo completo terminado:

Cita:
#!/usr/bin/perl

print "Ingrese el nombre del archivo .html \n";
$file=<STDIN>;
$file2=$file;

open(archivo,$file) || die "no se puede abrir el archivo\n";
open(html,">salida.html.spam") || die "$!";

@string=<archivo>;
my $string_html = join(" ", @string);

#Le sacamos los saltos de línea para trabajar más cómodos

$string_html =~ s/\n//g;

#tomamos el código que hay entre <body> y </body> con su contenido y atributos

my ($atributos,$contenido) = $string_html =~m#<body(.*?)>(.*?)</body>#i;

#elimino los 3 primeros caracteres a atributos y dejo todo en minusculas

$atributos =~ s/ bg//g;
$atributos =~ tr/[A-Z]/[a-z]/;

# si encuentro un texto(para eso el espacio, para diferenciar fondo de texto) con el color del fondo, lo paso a un color neutro (negro)

$string_html =~ s/ $atributos/color=#000000/;

# grabo al archivo
print html $string_html;

#cierro archivos
close(archivo);
close(html);
se agradece al maestro monoswin
  #20 (permalink)  
Antiguo 21/06/2005, 06:39
Avatar de monoswim
$moderador{'Esteban'}
 
Fecha de Ingreso: febrero-2002
Ubicación: Buenos Aires - Argentina
Mensajes: 8.762
Antigüedad: 22 años, 3 meses
Puntos: 90
Me alegro que lo hayas terminado...Te agradezco el agradecimiento pero si me volvés a llamar monoswiN tendré que matarte a golpes !!!!!!! jajaja !!!

Es monoswim...jeje...

Te felicito por el script y te agradezco el hecho de que lo hayas publicado, esto le podrá servir a los proximos usuarios que tengan esa clase de problema...

Saludos
__________________
Esteban Quintana
  #21 (permalink)  
Antiguo 21/06/2005, 07:20
 
Fecha de Ingreso: mayo-2003
Mensajes: 328
Antigüedad: 21 años
Puntos: 0
Hola:

Navengando por el foro me encontre este post y se me hizo interesante al problema. Ví el código final que diste, pero no entiendo muy bien como es que soluciona tu problema, así que decidí tomar unos 10 min. y hacer un pequeño script de prueba.

EL PROBLEMA

Crear un sencillo script que saque a la luz cualquier texto que haya sido oculto poniendolo del mismo color que el fondo de la página.

LA SOLUCIÓN

Lo primero que debemos de pensar, es que se pueden poner de dos manera los colores, por ejemplo el blanco se puede específicar usando #FFFFFF o poniendo simplemente la palabra white.

Hoy en día también se puede poner color a las fuentes usando el atributo de color= del tag font, o usando un style, por ejemplo style="color:white;".

Lo siguiente, es que para poder sacar a la luz el texto oculto, debemos de cambiar el color de la fuente al contrario del fondo, es decir si el fondo es blanco hay que poner el texto en negro, si el fondo es negro entonces lo ponemos en blanco. Con esto en mente, lo primero que vamos a hacer es un hash con la configuración de los colores:

Código:
my %BGCOLOR;
Vamos a crear una nueva llaver por cada color:

Código:
$BGCOLOR{"FFFFFF"} = ["white", "black"];
Por ejemplo, este nuevo elemento de nuestro hash, tiene la siguiente estructura. El nombre de la llave es el número hexadecimal del color, en el valor de la llaver creamos un hash, cuyo primer valor es el nombre del color, es decir FFFFFF=white, y el segundo elemento es el color contrario, es decir el negro es el contrario al blanco.

Podemos hacer una nueva llave para el color negro:

Código:
$BGCOLOR{"000000"} = ["black", "white"];
Es bastante sencillo meter nuevos colores para detectar.

Ahora, vamos a crear nuestra pequeña función que va a realizar todo el trabajo:

Código:
sub detectar_spam{

my $file = shift;

open(FILE,$file);
 my $html_string = join "", <FILE>;
close(FILE);

#Sacar el color del fondo
$html_string =~ m/bgcolor=\"?\#?(.*?)\"?\s+/ix;

 #Tenemos el color del background
 my $bgcolor = uc($1);

 #Vemos si existe una llave para el color del fondo
 #De lo contrario creamos un default
 if(!defined($BGCOLOR{$bgcolor})){
    $BGCOLOR{$bgcolor} = ["null", "black"];
 }

   #Sustituimos el color de las fuentes

   #Primero intentamos con color=
   $html_string =~ s/\bcolor\="?\#?$bgcolor"?/color\="$BGCOLOR{$bgcolor}[1]"/gix;
   $html_string =~ s/\bcolor\="?\#?$BGCOLOR{$bgcolor}[0]"?/color\="$BGCOLOR{$bgcolor}[1]"/gix;

   #Ahora vamos con el style color:
   $html_string =~ s/color\:\#?$bgcolor/color\:$BGCOLOR{$bgcolor}[1]/gix;
   $html_string =~ s/color\:$BGCOLOR{$bgcolor}[0]/color\:$BGCOLOR{$bgcolor}[1]/gix;


#CREAMOS EL NUEVO ARCHIVO
 open(HTML,">$file.spam") or die "No se pudo abrir el archivo: $!";
   print HTML $html_string;
 close(HTML);

}
Es bastante sencilla la función, lo que hace es recibir el nombre de un archivo, lo abre, guarda todo el contenido en un string, saca el color del fondo definido por bgcolor=, checa si tenemos un llave definida por el color del fondo, si no hay una llave definida entonces crea un default a negro y después realizar la sustitución en las fuentes, finalmente creando un nuevo archivo con terminación .spam.

El código final sería como sigue:
Código:
#!/usr/bin/perl -w

use strict;

print "Ingrese el nombre del archivo .html\n";
   my $file = <STDIN>;

   chomp($file);


my %BGCOLOR;
$BGCOLOR{"FFFFFF"} = ["white", "black"];
$BGCOLOR{"000000"} = ["black", "white"];
#etc... con todos los demás colores

detectar_spam($file);


sub detectar_spam{

my $file = shift;

open(FILE,$file);
 my $html_string = join "", <FILE>;
close(FILE);

#Sacar el color del fondo
$html_string =~ m/bgcolor=\"?\#?(.*?)\"?\s+/ix;

 #Tenemos el color del background
 my $bgcolor = uc($1);

 #Vemos si existe una llave para el color del fondo
 #De lo contrario creamos un default
 if(!defined($BGCOLOR{$bgcolor})){
    $BGCOLOR{$bgcolor} = ["null", "black"];
 }

   #Sustituimos el color de las fuentes

   #Primero intentamos con color=
   $html_string =~ s/\bcolor\="?\#?$bgcolor"?/color\="$BGCOLOR{$bgcolor}[1]"/gix;
   $html_string =~ s/\bcolor\="?\#?$BGCOLOR{$bgcolor}[0]"?/color\="$BGCOLOR{$bgcolor}[1]"/gix;

   #Ahora vamos con el style color:
   $html_string =~ s/color\:\#?$bgcolor/color\:$BGCOLOR{$bgcolor}[1]/gix;
   $html_string =~ s/color\:$BGCOLOR{$bgcolor}[0]/color\:$BGCOLOR{$bgcolor}[1]/gix;


#CREAMOS EL NUEVO ARCHIVO
open(HTML,">$file.spam") or die "No se pudo abrir el archivo: $!";
  print HTML $html_string;
close(HTML);

} #sub detectar_spam
Por ejemplo, puedes probar el nuevo script con un html como el que sigue:
Código HTML:
<html>

<head>
<title>Mi HTML con texto oculto</title>
</head>

<body bgcolor="#ffffff" text="#000000" link="#ff00ff" vlink="#ff80c0" alink="#ff0080">

Vamos a ver distintos textos en blanco:
<p>

<font color=#FFFFFF>1 Blanco</font><br>
<font color="#FFFFFF">2 Blanco</font><br>
<font color=FFFFFF>3 Blanco</font><br>
<font color="FFFFFF">4 Blanco</font><br>
<font color="white">5 Blanco</font><br>
<font color=white>6 Blanco</font><br>
<font style="color:#FFFFFF;">7 Blanco</font><br>
<font style="color:FFFFFF;">8 Blanco</font><br>
<font style="color:white;">9 Blanco</font><br>


</body>

</html> 

Al correr el script, vas a ver que te genera un nuevo HTML con todas las fuentes en color negro, sin importar que cada línea tiene definido el color blanco de manera distinta.


MEJORAS

Podrías mejorar el script poniendo la posibilidad de que detecte el color del fondo definido con CSS.

También puedes poner la capacidad de convertir los colores de fuentes esctritas de la siguiente manera: "fff", "000", "faf", etc...

---

Bueno, estos son mis dos pequeños centavos.


SALUDOS
__________________
Uriel Lizama, Perl Developer

Aprende Perl en Perl en Español.
  #22 (permalink)  
Antiguo 21/06/2005, 08:21
 
Fecha de Ingreso: diciembre-2004
Mensajes: 59
Antigüedad: 19 años, 4 meses
Puntos: 0
guau ¡¡, mi funcion es en pañales, comparada con esta
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 09:44.