Professional Documents
Culture Documents
Pagina 1
INDICE
1. Introduccin a CSV Robot
1.1 Que son los archivos CSV? .
1.2 Formato de los archivos CSV .
1.3 A quien est dirigido CSV Robot? ..
4
4
4
7
8
10
11
12
12
13
14
14
17
21
22
23
25
26
28
30
32
33
35
35
38
39
39
39
39
40
41
41
49
49
50
50
Pagina 2
60
60
62
62
63
65
70
71
76
76
82
82
82
82
Pagina 3
Edad
31
28
41
Telefono
555-234567
556-985634
433-095356
Pagina 4
dice que un archivo posee formato CSV cuando cumple una serie de convenciones muy
flexibles, y que dependen en gran medida del software que lo emplee.
Como no hay un Standard que lo rige, es muy comn que un software (A) que exporte
datos en formato CSV emplee un carcter como delimitador, mientras que otro software
(B) que permita el ingreso de datos a travs de un archivo CSV requiera otro
delimitador distinto, lo que en principio no permitira que (B) aprovechara los datos
generados por (A) sin que los mismos pasen antes por un proceso de conversin.
Las reglas generales que la gran mayora de los archivos CSV emplean son:
1 - La primera lnea del archivo es la lnea que contiene los nombres de las columnas
de la tabla de datos
En el ejemplo, el archivo contiene 3 columnas, Nombre, Edad y Telefono
Nombre,Edad,Telefono
2 - Cada lnea siguiente del archivo CSV, representa un fila de la tabla.
Normalmente, la denominacin correcta es que cada lnea es un REGISTRO de
informacin, y cada registro esta formado por una serie de CAMPOS (las columnas)
En el ejemplo:
Luis Esteban,31,555-234567, Es el registro numero 1 y:
Raul Lopez,28,556-985634, Es el registro numero 2
3 - Los campos de cada registro y de los nombres de las columnas se encuentran
delimitados por un carcter definido por el software, que sirve de separador para
determinar, al momento de leer cada registro, que valor pertenece a cada campo
En el primer ejemplo de CSV:
Nombre,Edad,Telefono
Luis Esteban,31,555-234567
Raul Lopez,28,556-985634
Maria Gomez,41,433-095356
Se emplea un delimitador ,. Entonces, el software, al leer el archivo puede interpretar
el comienzo y final de cada campo sobre cada registro, as puede determinar que para el
registro nmero 2, El campo Nombre tiene valor Raul Lopez, y el campo Edad
tiene valor 28.
Volvemos a repetir, no existe un Standard que obligue a emplear un delimitador en
particular. En principio, el siguiente ejemplo
Nombre?Edad?Telefono
Luis Esteban?31?555-234567
Raul Lopez?28?556-985634
Maria Gomez?41?433-095356
Es totalmente vlido como archivo CSV, pero el software que intente recuperar la
informacin de este archivo debe conocer que se emplea el carcter ? como
Pagina 5
delimitador de los campos. A pesar que se puede emplear como delimitador cualquier
carcter, la mayora de los softwares emplean , o ; como delimitador
4 - Todos los registros del archivo deben contener el mismo nmero de campos, lo
siguiente no es vlido:
Nombre,Edad,Telefono
31,555-234567
Raul Lopez,28,556-985634,23
En el primer registro, el software detecta 2 campos en el registro, pero la lnea de las
columnas indica que hay 3 campos definidos, entonces el software no puede determinar
si falta el campo Nombre, o nombre es 31 y falta el campo telefono.
De igual forma, al registro 2 le sobra un valor 23, que el software no tiene definido
como campo en la lnea de columnas.
Normalmente, cuando falta un valor en un registro se escribe de la siguiente manera:
Nombre,Edad,Telefono
Luis Esteban,,31,555-234567 (1)
Raul Lopez,28, (2)
,41,433-095356 (3)
Al registro (1) le falta el campo Edad
Al registro (2) le falta el campo Telefono
Al registro (3) le falta el campo Nombre
5 - Puede ocurrir que algn campo, contenga en su interior, como parte de la
informacin til, el mismo carcter que se emplea como delimitador del archivo, por
ejemplo:
Nombre,Edad,Nota Matematicas,Nota Geografia
Luis Esteban,18,8,9,10
Raul Lopez,19,7,5,8,2
Maria Gomez,18,6,3,9
Como hacemos para que el software que lee este archivo CSV interprete para el registro
numero 1 que 8,9 es el valor del campo Nota Matematicas y no tome , como
delimitador, asignando 8 a Nota Matematicas, 9 a Nota Geografia, y reporte un
error porque sobra el valor 10?
Para ello, se emplea un segundo carcter definido como agrupador. La funcion de este
segundo carcter es agrupar aquellos campos que contienen el carcter delimitador en su
interior. Normalmente este carcter son las comillas dobles.
Entonces, para denotar que 8,9 es una entidad nica y que no se debe interpretar como 8
y 9, se encierra entre comillas dobles. Entonces, el archivo CSV sera:
Luis Esteban,18,8,9,10
Raul Lopez,19,7,5,8,2
Maria Gomez,18,6,3,9
Pagina 6
6 - Como ocurre con el delimitador, puede ocurrir tambin que algn campo, contenga
en su interior, como parte de la informacin til, el mismo carcter que se emplea como
agrupador del archivo, por ejemplo, un archivo con informacin de libros:
Codigo,Nombre,Ubicacion
AB001,El rey Arturo, y los caballeros de la mesa redonda,Seccion A
AB002,Programacin en C, para torpes,Seccion B
Para estos casos, la solucin empleada depende en gran medida del software que
manipule los archivos. Algunos simplemente no permiten que los campos incluyan el
carcter agrupador, otros, emplean algn tipo de convencin para identificar estos casos,
entre las convenciones ms empleadas, por ejemplo:
1 - Si el valor incluye las comillas dobles, anteponer otro carcter de comillas dobles
(), es decir, Programacin en C, para torpes, se convierte en Programacin en C,
para torpes
2 - Si el valor incluye las comillas dobles, anteponer el carcter barra invertida (\), es
decir, Programacin en C, para torpes, se convierte en Programacin en C, para
\torpes\. CSV Robot emplea esta convencin.
Se puede concluir que un archivo CSV es un formato muy sencillo, que representa
simplemente una tabla de datos, que puede ser la entrada de datos a un software, o la
salida de datos procesados por un software.
El formato CSV es fcilmente interpretable por un ser humano, y a la vez, muy fcil de
procesar por un software, pero en la prctica, la sencillez y la falta de un Standard
provocan que cada software defina reglas propias, que impiden el intercambio de datos
entre distintos softwares.
Solucionar este tipo de problemas, y facilitar la interoperatividad entre sistemas es uno
de los objetivos de CSV Robot
1.3 A quien est dirigido CSV Robot?
Este software est dirigido tanto a aquellos usuarios de algn sistema de software que
requiera el ingreso de datos en formato CSV, como a aquellos que obtengan datos desde
un software en formato CSV, y necesiten realizar algn procesamiento sobre los
archivos. Si bien el formato es muy sencillo de manipular, no hay opciones de software
que permitan realizar tareas repetitivas sobre archivos CSV grandes de una manera
sencilla.
Este software esta principalmente orientado a los propietarios de tiendas online. Las
tiendas online proveen funciones de importacin (carga) masiva de productos y
generalmente requieren que los datos se carguen en forma de archivos de texto CSV.
El formato CSV es muy sencillo de manipular con un simple editor de texto. El
problema real surge cuando es necesario hacer una modificacin o procesamiento
repetitivo sobre un campo de un archivo que contiene cientos o miles de registros.
Pagina 7
Pagina 8
Comencemos con un ejemplo prctico, para entender mejor que puede hacer CSV
Robot
Ejemplo:
Disponemos de un archivo de datos CSV que representa una lista de productos, dicha
lista se ha obtenido de una planilla de Excel o de un software de gestin, y contiene los
siguientes datos:
SKU;NOMBRE;PRECIO;DESCRIPCION
A001;Producto1;$10,00;Descripcion1
A002;Producto2;$15,00;Descripcion2
A003;Producto3;$12,50;Descripcion3
..
Como se observa, el archivo emplea como separador de los valores el punto y coma,
posee 3 registros (filas de datos), y cada registro posee 4 campos (columnas):
- Sku, es el identificador de producto, un cdigo nico que lo identifica y diferencia del
resto de los productos de la lista.
- Nombre, es el nombre del producto
- Precio es el precio del producto, posee signo de moneda ($) y emplea la coma como
separador de enteros y decimales (ejemplo: $10,00)
- Descripcin, es la descripcin del producto.
Es muy normal que el software del cual hemos obtenido la lista de productos, y que
puede ser el software de gestin de nuestro negocio, posea ciertas convenciones propias
en cuanto a la representacin de la informacin, y que dichas convenciones no se
puedan modificar, como por ejemplo, el empleo de la coma como separador de enteros
y decimales en el precio, o el empleo del signo de moneda. Obsrvese tambin que es
muy comn en muchos softwares, exportar o importar archivos CSV que emplean el
carcter punto y coma como separador de los datos, y no la coma.
Estas convenciones, son las que provocan problemas a la hora de intentar cargar dicha
informacin en un software distinto como ser una tienda online. Puede ser que la tienda
online requiera que los precios empleen el punto como separador de enteros y
decimales, que no incluyan el signo de moneda, y que la separacin de los valores de
cada registro sea con el carcter coma, por ejemplo.
Esta adecuacin del archivo CSV obtenido de un software (nuestro software de
gestin y facturacin) para cargarlo en otro software distinto (nuestra tienda online)
puede ser muy sencilla si contiene una lista pequea de productos, pero lo normal es
que la lista contenga muchos registros. Se imagina convertir manualmente este archivo
(A) generado por su software de gestin:
SKU;NOMBRE;PRECIO;DESCRIPCION
A001;Producto1;$10,00;Descripcion1
A002;Producto2;$15,00;Descripcion2
A003;Producto3;$12,50;Descripcion3
..
En este archivo (B) requerido por su tienda online?:
SKU,NOMBRE,PRECIO,DESCRIPCION
A001,Producto1,10.00,Descripcion1
Pagina 9
A002,Producto2,15.00,Descripcion2
A003,Producto3,12.50,Descripcion3
..
Puede ser muy sencillo si la lista contiene 10, 20 o hasta 50 productos, pero si la lista
contiene 2000 productos? Y si es necesario actualizar los precios, agregar o quitar
productos con cierta frecuencia?, digamos diariamente?
All es donde radica la potencia de CSV Robot. CSV Robot puede convertir el archivo
(A) en el archivo (B) en forma totalmente automatizada, si se escribe adecuadamente la
Secuencia de tareas a realizar en el archivo de Script, y lo mas importante, es que el
archivo de script se puede guardar para emplearlo todas las veces que quiera sobre
distintos datos de entrada, por lo que la actualizacin de datos es muy sencilla.
2.1 El archivo Script
Vamos a hablar sobre el formato del archivo script empleado por CSV Robot, para
luego comenzar a adentrarnos en las funciones disponibles
El archivo de script es un archivo de texto que puede contener extensin txt o cualquier
otra que se desee. Es recomendable emplear extensin txt para crear y modificar el
archivo script con cualquier editor de texto.
El archivo de script tiene una estructura de archivo XML simplificada. Internamente
deben respetarse ciertas reglas de escritura para que el script pueda ser interpretado
correctamente por CSV Robot. La estructura general o esqueleto de un archivo Script
ejecutable por CSV Robot es la siguiente:
<ROOT>
<CONFIG>
..
..
</CONFIG>
<PROCESOS>
..
..
</PROCESOS>
</ROOT>
El archivo posee elementos llamados secciones. Cada seccin esta delimitada por las
etiquetas <NOMBRE_SECCION> y </NOMBRE_SECCION > y una seccin contiene
en su interior a otras secciones y/o parmetros.
Es obligatorio que el archivo de script respete esta estructura: una seccin principal
ROOT, o raz del script, que contiene en su interior dos secciones, CONFIG y
PROCESOS. En la seccin CONFIG se encuentran todos los parmetros de
configuracin que emplea CSV robot, como los archivos de entrada, formato de los
mismos, etc., y en la seccin PROCESOS, se encuentran justamente los procesos o
tareas a ejecutar.
Es necesario aclarar que CSV Robot ignora los espacios en blanco y tabulaciones antes
y despus del texto, por lo que es lo mismo escribir
Pagina 10
<ROOT>
<CONFIG>
..
</CONFIG>
<PROCESOS>
.
</PROCESOS>
</ROOT>
Pero se recomienda el empleo de tabulaciones ya que para un ser humano es mucho ms
fcil de leer el primer ejemplo.
CSV Robot interpreta los finales de lnea presentes en el archivo, por lo que escribir de
la forma
.
<CONFIG> .</CONFIG>
Pagina 11
2.3 Parmetros
Como se coment previamente, el archivo Script esta organizado en Secciones. Cada
seccin puede contener otras secciones y/o parmetros.
Las secciones sirven para ordenar y dar estructura al script, mientras que los parmetros
son informacin que CSV Robot emplea para trabajar
Los parmetros tienen la forma:
Parmetro = Valor
Valor, se encierra entre comillas. CSV Robot ignora los espacios en blanco, por lo que
es indistinto colocar o no espacios entre parmetro, valor y el signo =.
Los parmetros, tienen nombre y significado, algunos son obligatorios y otros son
opcionales. Los parmetros dentro de la seccin <CONFIG> determinan opciones de
funcionamiento de CSV Robot, como los nombres de los archivos de datos de entrada
ENTRADA_1 y ENTRADA_2 y el nombre del archivo resultado SALIDA.
Los parmetros dentro de la seccin <PROCESOS> configuran cada una de las
opciones de los procesos a aplicar a fin de obtener los resultados deseados.
2.4 La seccin <CONFIG>
Toda la configuracin principal del funcionamiento de CSV Robot se encuentra dentro
de la seccin <CONFIG> del archivo script. Los parmetros que se encuentran dentro
de <CONFIG> son los siguientes:
ARCHIVO_ENTRADA_1: Obligatorio - Indica el nombre del archivo en formato CSV
que ser empleado como entrada de datos numero 1 a CSV Robot.
ARCHIVO_ENTRADA_2: Opcional - Indica el nombre del archivo en formato CSV
que ser empleado como entrada de datos numero 2 a CSV Robot.
ARCHIVO_SALIDA: Obligatorio - Indica el nombre del archivo en formato CSV en el
cual se almacenaran los datos procesados por CSV Robot.
DELIMITADOR_ENTRADA_1: Opcional Indica cual es el carcter delimitador
empleado en ARCHIVO_ENTRADA_1. El valor de este parmetro puede ser , o ;.
Si este parmetro no esta presente, se asume que ARCHIVO_ENTRADA_1 emplea el
carcter , como delimitador de los datos.
DELIMITADOR_ENTRADA_2: Opcional Indica cual es el carcter delimitador
empleado en ARCHIVO_ENTRADA_2. El valor de este parmetro puede ser , o ;.
Si este parmetro no esta presente, se asume que ARCHIVO_ENTRADA_2 emplea el
carcter , como delimitador de los datos.
DELIMITADOR_SALIDA: Opcional Indica cual es el carcter delimitador empleado
en ARCHIVO_ SALIDA. El valor de este parmetro puede ser , o ;. Si este
parmetro no esta presente, se asume que ARCHIVO_ SALIDA emplea el carcter ,
como delimitador de los datos.
Nota sobre los nombres de archivo: CSV Robot trabaja con carpetas relativas a la
carpeta en la que se encuentra el script. Por lo tanto, los nombres de archivo que se
especifican sin ruta, se buscan en la misma carpeta que el script.
Pagina 12
Pagina 13
..
<NOMBRE_PROCESO>
; comentario (opcional)
Parametro1 = Valor1
Parametro1 = Valor1
ParametroN = ValorN
; comentario (opcional)
</ NOMBRE_PROCESO>
..
.
</PROCESOS>
Como se comento previamente, todos los procesos se ubican dentro de la seccin
PROCESOS, y cada proceso es en si mismo una sub seccin encerrada entre etiquetas
<NOMBRE_PROCESO> y </NOMBRE_PROCESO>. Ms adelante se vern con
ejemplos prcticos cada uno de los procesos y su funcionamiento.
Cada proceso requiere de ciertos parmetros para funcionar o realizar su tarea
correctamente. Dichos parmetros se definen de la misma forma que se trato
anteriormente para la seccin <CONFIG>, pero dentro de la seccin que conforma el
proceso en si. Dependiendo el proceso que se trate, requerir algunos parmetros en
forma obligatoria y otros en forma opcional.
2.7 Segunda aproximacin al funcionamiento de CSV Robot
Estamos en condiciones de ver el funcionamiento de CSV Robot en ms detalle.
Supongamos que disponemos del siguiente archivo A.txt con formato CSV:
Nombre Producto,Sku,Precio
Producto1;TP01;$10.00
Producto2;TP02;$12.00
Y deseamos convertirlo en el archivo Salida.txt de la forma:
Product Name,Sku,Price,Manufacturer
Pagina 14
Producto1,TP01,10,00,ACME
Producto2,TP02,12,00,ACME
(Ntese que la columna Price posee los valores encerrados entre comillas dobles,
porque adems de eliminarse el signo de moneda $, se ha cambiado el signo de
decimales por la coma , y como la coma se emplea como delimitador de los valores
del archivo, es necesario agrupar con comillas dobles para evitar que se interpreten las
comas internas como delimitadores)
Establezcamos ciertas convenciones y definiciones para comprender mejor el
funcionamiento de CSV Robot:
1 - Cada lnea del archivo de entrada se denomina registro de entrada. La primera
lnea es el registro 1, la segunda el registro 2, etc. En el caso del ejemplo, el primer
registro del archivo A.txt es:
Producto1;TP01;$10.00
CSV Robot denomina al registro que proviene del archivo de entrada de datos numero 1
como ENTRADA_1, y al que contiene datos del archivo de datos numero 2 (opcional),
ENTRADA_2.
2 - Cada lnea del archivo de salida se denomina registro de salida. La primera lnea
es el registro 1, la segunda el registro 2, etc. En el caso del ejemplo, el primer registro
del archivo Salida.txt es:
Producto1,TP01,10,00,ACME
CSV Robot denomina al registro del archivo de salida SALIDA.
3 - Cada Registro de Entrada, luego de aplicarse las operaciones o procesos indicados
en el script se transforma en un registro de salida, es decir, hay una correspondencia 1 a
1 entre el archivo de entrada y el archivo de salida. Cada registro de entrada, luego de
aplicar las operaciones o procesos, genera como resultado un nico registro de salida. Si
el archivo de entrada contiene 100 registros, el de salida contendr 100 registros, ni uno
mas, ni uno menos.
4 - No es necesario que el registro de salida contenga la misma cantidad de columnas
o campos que el registro de salida. En el ejemplo, el registro de entrada posee 3
campos (Nombre Producto,Sku,Precio), y el registro de salida posee 4 campos (Product
Name,Sku,Price,Manufacturer) Tambin se observa que no es necesario que los campos
del registro de salida tengan el mismo nombre ni el mismo orden que los campos del
registro de entrada.
Volviendo al ejemplo, si pudisemos dar instrucciones a CSV Robot en lenguaje
humano escribiramos un script semejante a esto:
Opciones de configuracin:
1 - El archivo de entrada se llama: A.txt
2 - El archivo de entrada emplea ; como separador
3 - El archivo de salida se llama Salida.txt
4 - Quiero emplear el carcter , como separador del archivo de salida
Sobre cada Registro (lnea) del archivo de entrada quiero que realices las siguientes
operaciones (Procesos):
1 - Toma un registro o lnea del archivo de entrada.
Pagina 15
Pagina 16
; Paso 4
<COPIA COLUMNA>
Origen = Sku, en registro ENTRADA
Destino = Sku, en registro SALIDA
</COPIA COLUMNA>
; Paso 5 (A)
<COPIA COLUMNA>
Origen = Precio, en registro ENTRADA
Destino = Price, en registro SALIDA
</COPIA COLUMNA>
; Paso 5 (B)
<ELIMINA TEXTO>
Origen = Price, en registro SALIDA
Destino = Price, en registro SALIDA
Texto a eliminar = $
</ELIMINA TEXTO>
; Paso 5 (C)
<REEMPLAZA TEXTO>
Origen = Price, en registro SALIDA
Destino = Price, en registro SALIDA
Texto a eliminar = $
</ REEMPLAZA TEXTO>
; Paso6
<AGREGA COLUMNA>
Nombre = Manufacturer, en registro SALIDA
Valor = ACME
</AGREGA COLUMNA>
; Paso 7
<GUARDA REGISTRO SALIDA>
Guarda el registro de salida empleando el delimitador
DELIMITADOR_SALIDA
</ GUARDA REGISTRO SALIDA >
</PROCESOS>
</ROOT>
Hay que notar que el paso 5 se ha dividido en 3 operaciones, la primera es de copia,
copia el contenido de la columna Precio del registro de entrada a la columna Price
del registro de salida, la segunda operacin, elimina el smbolo $ del contenido de la
columna Price y guarda el resultado de la operacin en la misma columna Price.
Finalmente, la tercera operacin, reemplaza el smbolo . Empleado como separador
decimal, por el smbolo ,.
Este tipo de operaciones, en donde se opera sobre una columna y el resultado se guarda
en la misma son muy comunes.
2.8 La lgica de ejecucin de CSV Robot
Del ejemplo anterior, hay que aclarar que los pasos 1,2 y 7 son realizado
automticamente por CSV Robot, es decir, CSV Robot comienza por analizar el script,
verificar que se encuentren las secciones requeridas (<CONFIG> y <PROCESOS>),
que se encuentren los parmetros de configuracin obligatorios (Archivo de entrada 1 y
Pagina 17
Pagina 18
1 Botn Abrir Script: Al hacer clic en este botn, se presentar un cuadro de dilogo
que permitir seleccionar el archivo script a cargar:
Recordar que el archivo script puede tener cualquier extensin y nombre, mientras sea
un archivo de texto y cumpla con el formato requerido por CSV Robot. Se recomienda
emplear el nombre Script.txt (El nombre para recordar de que se trata, y txt para
poder editarlo con cualquier editor simple de texto).
Pagina 19
3 Informacin del script: Aqu se presenta la informacin del script abierto, nombre
del archivo script, y los nombres de los archivos de entrada 1 y 2, y de salida
(parmetros recuperados del archivo script)
Pagina 20
Como hay errores que solo se pueden detectar cuando se ejecuta el script, esta
informacin es muy til para encontrar errores en los scripts.
Pagina 21
</CONFIG>
<PROCESOS>
</PROCESOS>
</ROOT>
Sin ningn proceso a ejecutar, se obtendr un archivo de salida vaco, sin registros ni
columnas, ya que NINGUNA COLUMNA de los registros de entrada se copia
automticamente al registro de salida.
Volviendo al proceso que estamos conociendo, si escribimos un script (a partir de este
punto se omiten las etiquetas ROOT y la seccin CONFIG para clarificar el texto) de la
forma:
..
<PROCESOS>
<SETEAR_VALOR_COLUMNA>
Pagina 22
COLUMNA = Proveedor
VALOR = ACME
</SETEAR_VALOR_COLUMNA>
</PROCESOS>
Pagina 23
</SETEAR_VALOR_COLUMNA>
</PROCESOS>
Se obtendr un archivo ARCHIVO_SALIDA de la forma
Name
Producto1
Producto1
Producto1
Esto ocurre as porque el valor Producto 1 que se setea en la columna Name es una
constante, y no cambia su valor en cada ciclo de trabajo sobre los registros.
Si ahora en cambio, escribimos el proceso de la siguiente forma:
<PROCESOS>
<SETEAR_VALOR_COLUMNA>
COLUMNA = Name
VALOR = <% ENTRADA_1:NOMBRE %>
</SETEAR_VALOR_COLUMNA>
</PROCESOS>
Se obtendr un archivo ARCHIVO_SALIDA de la forma
Name
Producto1
Producto2
Producto3
Que ha pasado?
Se ha empleado la caracterstica de Direccionamiento de variables. El direccionamiento
de variables tiene la forma <% REGISTRO:COLUMNA %> y lo que provoca es que
antes de ejecutarse el proceso, se reemplazan los valores contenidos entre <% y %> por
los valores diseccionados. En este caso, se reemplaza <% ENTRADA_1:NOMBRE %>
por el valor contenido en la columna NOMBRE del registro ENTRADA_1.
Recordar que en cada ciclo de ejecucin, se toma un nuevo registro ENTRADA_1
desde el archivo ARCHIVO_ENTRADA_1, un nuevo registro ENTRADA_2 desde el
archivo ARCHIVO_ENTRADA_2 y se genera un nuevo registro de salida vaco, por lo
tanto, en el primer ciclo de ejecucin <% ENTRADA_1:NOMBRE %> se reemplaza
por Producto1, en el segundo ciclo por Producto2 y en el tercer ciclo por
Producto3.
En el direccionamiento de variables, REGISTRO puede ser ENTRADA_1,
ENTRADA_2 o SALIDA. Y COLUMNA, debe existir previamente, de lo contrario, se
interrumpe el script y reporta error.
Con estos conceptos, vamos a emplear el proceso SETEAR_VALOR_COLUMNA, en
conjunto con el direccionamiento de variables para algunos ejemplos prcticos
Los ejemplos que se presentan a continuacin trabajan con los siguientes archivos de
datos:
Entrada1.txt:
Pagina 24
Nombre;Sku;Precio
Producto1;TP01;$10.00
Producto2;TP02;$12.00
Producto3;TP03;$13.00
Entrada2.txt
Descripcion,Oferta
Descripcion1,Si
Descripcion2,No
Descripcion3,No
4.1.2 Ejemplo 1 Conversin de formatos CSV
Este ejemplo de puede encontrar en Ejemplos\Ejemplo1\Script.txt
Este ejemplo simplemente genera un archivo Salida.txt que contiene la misma
informacin que Entrada1, solo que Entrada1.txt posee como delimitador de campos el
carcter ; y Salida emplea el delimitador ,
Script:
<ROOT>
; Parametros de Configuracion
; --------------------------------------------------------------<CONFIG>
(1)
ARCHIVO_ENTRADA_1 = "Entrada1.txt"
(2)
DELIMITADOR_ENTRADA_1 = ";"
(3)
(4)
ARCHIVO_SALIDA = "Salida.txt"
</CONFIG>
; LISTA DE PROCESOS
; --------------------------------------------------------------<PROCESOS>
(5)
<SETEAR_VALOR_COLUMNA>
COLUMNA = "Nombre"
VALOR = "<% ENTRADA_1:Nombre %>"
</SETEAR_VALOR_COLUMNA>
(6)
<SETEAR_VALOR_COLUMNA>
COLUMNA = "Sku"
VALOR = "<% ENTRADA_1:Sku %>"
</SETEAR_VALOR_COLUMNA>
(7)
<SETEAR_VALOR_COLUMNA>
COLUMNA = "Precio"
VALOR = "<% ENTRADA_1:Precio %>"
</SETEAR_VALOR_COLUMNA>
Pagina 25
</PROCESOS>
</ROOT>
Configuracin:
(1) Se configura Entrada1.txt como archivo de datos para el registro de entrada 1
(2) Se indica que el archivo de entrada 1 posee como delimitador ;
(3) Se omite el parmetro ARCHIVO_ENTRADA_2, ya que no se necesitan datos de
otro archivo. (Se ha dejado la lnea en blanco para explicar, pero no es necesario).
(4) Se configura Salida.txt como nombre del archivo de salida donde almacenar los
resultados del script. Ntese que se omite el parmetro DELIMITADOR_SALIDA, ya
que su valor por defecto es , y es el delimitador que se desea para Salida.txt
Procesos
(5) Recordemos que el registro SALIDA inicia cada ciclo de trabajo sin columnas ni
valores. Aqu se setea el valor de la columna Nombre del registro SALIDA (como no
existe la columna previamente, se crea la misma), con el valor proveniente de la
columna Nombre del registro ENTRADA_1 (que como se sabe toma sus valores del
archivo Entrada1.txt). En resumen, esta operacin copia el valor de la columna
Nombre del registro ENTRADA_1 en el registro SALIDA, en la columna tambin
llamada Nombre.
(6) La misma operacin, copia la columna Sku al registro de salida, con nombre
tambin Sku
(7) La misma operacin, copia la columna Precio al registro de salida, con nombre
tambin Precio. Finalizada la operacin, el registro de salida, que ahora posee
columnas Nombre, Sku y Precio, se guarda en el archivo Salida.txt, empleando
, como delimitador de valores.
Luego de ejecutar este script se obtiene Salida.txt:
Nombre,Sku,Precio
Producto1,TP01,$10.00
Producto2,TP02,$12.00
Producto3,TP03,$13.00
4.1.3 Ejemplo 2 Cambio de nombres de columnas
Este ejemplo de puede encontrar en Ejemplos\Ejemplo2\Script.txt
Este ejemplo es muy similar a ejemplo 1. Se genera un archivo Salida.txt que contiene
la misma informacin que Entrada1, solo que Entrada1.txt posee como delimitador de
campos el carcter ; y Salida emplea el delimitador ,, Y ahora se aade el
requerimiento de que las columnas del archivo de salida se deben Llamar Name,
Sku y Price
Script:
<ROOT>
; Parmetros de Configuracin
; --------------------------------------------------------------<CONFIG>
Pagina 26
ARCHIVO_ENTRADA_1 = "Entrada1.txt"
DELIMITADOR_ENTRADA_1 = ";"
ARCHIVO_SALIDA = "Salida.txt"
</CONFIG>
; LISTA DE PROCESOS
; --------------------------------------------------------------<PROCESOS>
(1)
<SETEAR_VALOR_COLUMNA>
COLUMNA = "Name"
VALOR = "<% ENTRADA_1:Nombre %>"
</SETEAR_VALOR_COLUMNA>
(2)
<SETEAR_VALOR_COLUMNA>
COLUMNA = "Sku"
VALOR = "<% ENTRADA_1:Sku %>"
</SETEAR_VALOR_COLUMNA>
(3)
<SETEAR_VALOR_COLUMNA>
COLUMNA = "Price"
VALOR = "<% ENTRADA_1:Precio %>"
</SETEAR_VALOR_COLUMNA>
</PROCESOS>
</ROOT>
Configuracin:
dem a Ejemplo 1
Procesos
(1) Se realiza una copia del contenido de la columna Nombre del registro de entrada 1
a la columna Name del registro de Salida. Como dicha columna no exista
previamente, se crea antes de copiar el valor
(2) La misma operacin, copia la columna Sku al registro de salida, con nombre
tambin Sku
(3) La misma operacin, copia la columna Precio al registro de salida, con nombre
ahora Price. Finalizada la operacin (3), el registro de salida, que ahora posee
columnas Name, Sku y Price, se guarda en el archivo Salida.txt
Luego de ejecutar este script se obtiene Salida.txt:
Name,Sku,Price
Producto1,TP01,$10.00
Producto2,TP02,$12.00
Producto3,TP03,$13.00
Pagina 27
<SETEAR_VALOR_COLUMNA>
COLUMNA = "Sku"
VALOR = "<% ENTRADA_1:Sku %>"
</SETEAR_VALOR_COLUMNA>
(6)
<SETEAR_VALOR_COLUMNA>
COLUMNA = "Description"
VALOR = "<% ENTRADA_2:Descripcion %>"
</SETEAR_VALOR_COLUMNA>
</PROCESOS>
</ROOT>
Configuracin:
(1) Se configura Entrada1.txt como archivo de datos para el registro de entrada 1, y se
indica que posee datos delimitados por ;
(2) Se configura Entrada2.txt como archivo de datos para el registro de entrada 2, y se
indica, por omisin del parmetro DELIMITADOR_ENTRADA_2, que posee datos
delimitados por ,
(3) Se configura el archivo de salida como Salida.txt, empleando tambin , como
delimitador.
Pagina 28
Procesos
(4) Se copia el contenido de la Columna Nombre del registro de Entrada 1 en la
columna Name del registro de salida.
(5) Se copia el contenido de la Columna Sku del registro de Entrada 1 en la columna
Sku del registro de salida.
(6) Se copia el contenido de la Columna Descripcion del registro de ENTRADA 2 en
la columna Description del registro de salida.
Luego de ejecutar este script se obtiene Salida.txt:
Name,Sku,Price,Description
Producto1,TP01,$10.00,Descripcion1
Producto2,TP02,$12.00,Descripcion2
Producto3,TP03,$13.00,Descripcion3
Nota importante: Cuando se combinan datos desde dos archivos de entrada
ENTRADA_1 y ENTRADA_2, es OBLIGATORIO, que ambos archivos posean la
misma cantidad de registros, ya que en cada ciclo de trabajo CSV Robot lee un
registro de cada archivo, aplica los procesos definidos en el script y genera un nico
registro de salida. La condicin de igualdad en la cantidad de registros de los
archivos de entrada, se verifica al momento de cargar el archivo script. Si los
archivos de entrada difieren en el numero de registros, CSV Robot lo advierte con un
mensaje de error, y no permite la ejecucin del script.
Despus de ver estos ejemplos, se puede entender la potencia que posee CSV Robot
para ejecutar tareas repetitivas sobre archivos en formato CSV. Con solo un proceso de
los que CSV pone a disposicin de los usuarios se puede ahorrar mucho tiempo de
trabajo y eliminar la posibilidad de errores al intentar convertir a mano grandes
archivos CSV.
Pagina 29
Pagina 30
(1) <EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "Texto de prueba, precio $10.25 para este producto"
COLUMNA = "Price"
TAG_INICIO = "$"
TAG_FINAL = "."
</EXTRAER_TEXTO_DESDE_TEXTO>
Almacena 10 en la columna Price
(2) <EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "Texto de prueba, precio $10.25 para este producto"
COLUMNA = "Price"
TAG_INICIO = "$"
TAG_FINAL = "."
INCLUIR_TAGS = "1"
</EXTRAER_TEXTO_DESDE_TEXTO>
Almacena $10. en la columna Price Ntese que el fragmento extrado es el mismo
que para (1), solo que ahora se aaden los tags delimitadores antes de guardar el
resultado en la columna Price
(3) <EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "Texto de prueba, precio $10.25 para este producto"
COLUMNA = "Price"
TAG_INICIO = "$"
TAG_FINAL = " "
</EXTRAER_TEXTO_DESDE_TEXTO>
Almacena 10.25 en la columna Price
(4) <EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "Texto de prueba"
COLUMNA = "Resultado"
TAG_INICIO = ""
TAG_FINAL = " "
</EXTRAER_TEXTO_DESDE_TEXTO>
Almacena Texto en la columna Resultado. Ntese que TAG_INICIO = indica
que el fragmento a extraer comienza desde el inicio del texto fuente
(5) -
Pagina 31
<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "Texto de prueba"
COLUMNA = "Resultado"
TAG_INICIO = "de "
TAG_FINAL = ""
</EXTRAER_TEXTO_DESDE_TEXTO>
Almacena prueba en la columna Resultado. Ntese que TAG_FINAL = indica
que el fragmento a extraer termina donde finaliza el texto fuente
4.2.1 Ejemplo 4 Extraccin de texto
Este ejemplo de puede encontrar en Ejemplos\Ejemplo4\Script.txt
Este ejemplo toma 1 archivo de entrada Entrada1.txt con columnas Nombre, Sku y
Precio, y genera un archivo de salida Salida.txtcon columnas Name, Sku y Price con
los valores correspondientes. La particularidad de este ejemplo es que la columna
Precio del archivo de entrada tiene la forma $10.00, y la columna Price posee la
forma 10.00 (sin $)
Entrada1.txt:
Nombre,Sku,Precio
Producto1,TP01,$10.00
Producto2,TP02,$12.00
Producto3,TP03,$13.00
Script:
<ROOT>
; Parametros de Configuracion
; --------------------------------------------------------------<CONFIG>
(1)
ARCHIVO_ENTRADA_1 = "Entrada1.txt"
(2)
ARCHIVO_SALIDA = "Salida.txt"
</CONFIG>
; LISTA DE PROCESOS
; --------------------------------------------------------------<PROCESOS>
(3)
<SETEAR_VALOR_COLUMNA>
COLUMNA = "Name"
VALOR = "<% ENTRADA_1:Nombre %>"
</SETEAR_VALOR_COLUMNA>
(4)
<SETEAR_VALOR_COLUMNA>
COLUMNA = "Sku"
VALOR = "<% ENTRADA_1:Sku %>"
</SETEAR_VALOR_COLUMNA>
Pagina 32
(5)
<SETEAR_VALOR_COLUMNA>
COLUMNA = "Price"
VALOR = "<% ENTRADA_1:Precio %>"
</SETEAR_VALOR_COLUMNA>
(6)
<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA:Price %>"
COLUMNA = "Price"
TAG_INICIO = "$"
TAG_FINAL = ""
</EXTRAER_TEXTO_DESDE_TEXTO>
</PROCESOS>
</ROOT>
Configuracin:
(1) Se configura Entrada1.txt como archivo de datos para el registro de entrada 1, y
por omisin del parmetro DELIMITADOR, se asume que el archivo de entrada 1
posee como delimitador ,
(2) Se configura Salida.txt como nombre del archivo de salida donde almacenar los
resultados del script, tambin con delimitador ,.
Procesos
(3) Se realiza una copia del contenido de la columna Nombre del registro
ENTRADA_1 a la columna Name del registro SALIDA. Como dicha columna no
exista previamente, se crea antes de copiar el valor
(4) La misma operacin, copia la columna Sku al registro SALIDA, con nombre
tambin Sku
(5) La misma operacin, copia la columna Precio al registro SALIDA, con nombre
ahora Price.
(6) Se realiza un proceso EXTRAER_TEXTO_DESDE_TEXTO. Dicho proceso toma
el contenido de la columna Price del registro SALIDA (dicha columna se creo en el
paso (5) con el valor original de la columna Precio), y de la misma extrae el texto que
comienza a partir de la primera aparicin del texto $ y hasta el final del texto fuente.
El fragmento extrado se guarda en la misma columna Price del cual se tomo el texto
fuente a procesar.
4.2.2 Optimizacin del script
En el paso (6), el proceso EXTRAER_TEXTO_DESDE_TEXTO guarda el resultado de
la extraccin de texto en la columna Price del registro SALIDA. Dicha columna fue
creada previamente en el paso (5). Como el proceso
EXTRAER_TEXTO_DESDE_TEXTO verifica si la columna donde se almacena el
resultado de la operacin existe, y de no ser as, la crea antes de almacenar el valor, se
pueden reemplazar los procesos (5) y (6) por un nico proceso optimizado (5):
(5)
<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% ENTRADA_1:Precio %>"
COLUMNA = "Price"
TAG_INICIO = "$"
Pagina 33
TAG_FINAL = ""
</EXTRAER_TEXTO_DESDE_TEXTO>
Ntese que ahora, en lugar de hacer un paso previo copiando el contenido a desde la
columna Precio del registro ENTRADA_1 a una nueva columna Price, y luego
realizar el proceso de extraccin, se hace un solo paso, realizando el proceso de
extraccin desde la columna original Precio y guardando el resultado en la columna
Price que como no exista previamente, se crea para completar la operacin.
Luego de ejecutar este script se obtiene Salida.txt:
Name,Sku,Price
Producto1,TP01,10.00
Producto2,TP02,12.00
Producto3,TP03,13.00
Pagina 34
Pagina 35
(2)
ARCHIVO_SALIDA = "Salida.txt"
</CONFIG>
; LISTA DE PROCESOS
; --------------------------------------------------------------<PROCESOS>
(3)
<SETEAR_VALOR_COLUMNA>
COLUMNA = "Nombre"
VALOR = "<% ENTRADA_1:Nombre %>"
</SETEAR_VALOR_COLUMNA>
(4)
<SETEAR_VALOR_COLUMNA>
COLUMNA = "Sku"
VALOR = "<% ENTRADA_1:Sku %>"
</SETEAR_VALOR_COLUMNA>
(5)
<SETEAR_VALOR_COLUMNA>
COLUMNA = "Precio"
VALOR = "<% ENTRADA_1:Precio %>"
</SETEAR_VALOR_COLUMNA>
(6)
<REEMPLAZAR_TEXTO_EN_TEXTO>
TEXTO = "<% SALIDA:Precio %>"
COLUMNA = "Precio"
BUSCAR = "$"
REEMPLAZAR = ""
</REEMPLAZAR_TEXTO_EN_TEXTO>
(7)
<REEMPLAZAR_TEXTO_EN_TEXTO>
TEXTO = "<% SALIDA:Precio %>"
COLUMNA = "Precio"
BUSCAR = "."
REEMPLAZAR = ","
</REEMPLAZAR_TEXTO_EN_TEXTO>
</PROCESOS>
</ROOT>
Configuracin:
(1) Se configura Entrada1.txt como archivo de datos para el registro de entrada 1, y
por omisin del parmetro DELIMITADOR, se asume que el archivo de entrada 1
posee como delimitador ,
(2) Se configura Salida.txt como nombre del archivo de salida donde almacenar los
resultados del script, tambin con delimitador ,.
Procesos
(3) Se realiza una copia del contenido de la columna Nombre del registro
ENTRADA_1 a la columna Nombre del registro SALIDA. Como dicha columna no
exista previamente en el registro SALIDA, se crea antes de copiar el valor
(4) La misma operacin, copia la columna Sku al registro SALIDA, con nombre
tambin Sku
Pagina 36
(5) La misma operacin, copia la columna Precio al registro SALIDA, con nombre
ahora Precio.
(6) Se realiza un proceso REEMPLAZAR_TEXTO_EN_TEXTO. Dicho proceso toma
el contenido de la columna Precio del registro SALIDA (dicha columna se creo en el
paso (5) con el valor original de la columna Precio), y en el contenido de dicha
columna, BUSCA la primera aparicin de $ y la REEMPLAZA por , es decir,
elimina la aparicin de $.El texto resultante de este proceso se guarda nuevamente en
la columna Precio del registro SALIDA.
(7) Se realiza un proceso REEMPLAZAR_TEXTO_EN_TEXTO. Dicho proceso toma
el contenido de la columna Precio del registro SALIDA, y en el contenido de dicha
columna, BUSCA la primera aparicin de . y la REEMPLAZA por ,.El texto
resultante de este proceso se guarda nuevamente en la columna Precio
Luego de ejecutar este script se obtiene Salida.txt:
Name,Sku,Price
Producto1,TP01,"10,00"
Producto2,TP02,"12,00"
Producto3,TP03,"13,00"
Nota Importante: en el archivo de salida, la columna Precio posee los valores de
cada registro encerrados entre comillas dobles. Eso es porque el valor de esa columna
contiene un carcter , que es el mismo que se emplea como delimitador de campos
para el archivo de salida. El cierre de valores entre comillas se realiza
automticamente por CSV Robot cuando detecta que el valor de un campo posee en
su interior el mismo carcter que se emplea como delimitador en el archivo. Si en el
script se hubiese empleado ; como delimitador del archivo Salida.txt, todos los
campos estaran separados por ; y el campo precio no estara encerrado entre
comillas, porque ya no sera necesario.
Pagina 37
<SETEAR_VALOR_COLUMNA>
COLUMNA = "Temp"
VALOR = "<% ENTRADA_1:Nombre %>"
</SETEAR_VALOR_COLUMNA>
.
.
.
(2)
<QUITAR_COLUMNA>
COLUMNA = "Temp"
</ QUITAR_COLUMNA >
.
.
</PROCESOS>
Procesos
(1) Se realiza una copia del contenido de la columna Nombre del registro
ENTRADA_1 a la columna Temp del registro SALIDA. Si dicha columna no exista
previamente, se crea antes de copiar el valor
(2) Luego de una serie de procesos, que emplearon el contenido de la columna Temp
para diversas operaciones, se decide eliminar dicha columna del registro SALIDA, para
que no aparezca al final del proceso en el archivo de salida. Entonces de ejecuta el
proceso QUITAR_COLUMNA indicando que elimine la columna Temp.
Pagina 38
Pagina 39
Para ello, planteamos como ejemplo la necesidad de extraer los nombres y precios de
varios productos de la siguiente tienda online:
http://www.e-crazydeals.com
Las razones por las que necesitamos acceder a los productos de esta web y extraer
informacin pueden ser muy variadas, por ejemplo:
- Vendemos los mismos productos en ebay y deseamos tener un proceso automatizado
que extraiga los precios de los productos que comercializamos de varias webs, para
comparar con nuestros precios
- La tienda es nuestro proveedor, y con este proceso automatizado podemos extraer
imgenes, descripciones y precios para luego aadir a nuestra propia tienda.
Si navegamos por la tienda e ingresamos a la pagina de un producto, por ejemplo:
http://www.e-crazydeals.com/store/index.php/ramos-w19-v2-0-tablet-pc-android-4-0-3cortex-a9-dual-camera-8gb.html
Vemos una pagina de producto con nombre, descripcin, imgenes, precio, etc.
Si entramos a las pginas de varios productos de la tienda y empleamos alguna
herramienta que nos permita ver la estructura html de la pgina (muy recomendable
google chrome, opcin inspeccionar elemento del men contextual), veremos que se
repite constantemente la misma estructura, y solo varia el contenido. Esto es muy
comn, porque estas tiendas mantienen su informacin en una base de datos y cuando se
accede a la pgina de un producto, se emplea una plantilla que se rellena con la
informacin referente al producto que estamos viendo.
5.1.2 Anlisis de la estructura de la pgina
Siempre para poder encarar un proceso de extraccin de informacin de la web, es
necesario analizar la estructura de las pginas de la web en la que me interesa extraer la
informacin.
Para este ejemplo, intentamos acceder a las pginas de varios productos de una tienda
online, y recuperar de las mismas nombre del producto y precio.
Si ingresamos a la pgina de cualquier producto de la tienda y analizamos su estructura
veremos lo siguiente:
1 - El nombre del producto se encuentra en un DIV de la siguiente forma:
.<div class="product-name" sourceindex="128"
siber__q92dpb7seovvtbh5__vptr="11a2f20"><h1 sourceindex="129"
siber__q92dpb7seovvtbh5__vptr="11a01b0">Ramos W19 V2.0 Tablet PC Android
4.0.3 Cortex A9 Dual Camera 8GB</h1></div>.
Es importante al analizar una pgina para hacer web scraping, ubicar los elementos
estructurales del html de la pgina. En el texto, se han coloreado con azul los mismos.
Estos elementos normalmente no variaran dentro de la misma web, independientemente
del producto que estemos visualizando, y nos sern de utilidad para encontrar y extraer
la informacin que nos interesa.
Pagina 40
Pagina 41
el contenido en una columna del registro de salida, entonces ser necesario emplear una
columna temporal para almacenar el HTML descargado y procesarlo.
Empezaremos por copiar ID del registro de entrada al registro de Salida
<PROCESOS>
<SETEAR_VALOR_COLUMNA>
COLUMNA = "ID"
VALOR = "<% ENTRADA_1:ID %>"
</SETEAR_VALOR_COLUMNA>
Ahora, realizaremos la descarga de la pagina, empleando el link que proviene del
archivo de entrada:
<DESCARGAR_HTML>
COLUMNA = "TEMP_HTML"
LINK = "<% ENTRADA_1:Link %>"
</DESCARGAR_HTML>
Este proceso descarga el html de una pgina, en una columna destino del registro
SALIDA. A esa columna la hemos llamado TEMP_HTML. Como la columna no existe
previamente, se crea para la operacin. La direccin de la pgina se provee al proceso
con el parmetro LINK, que en este caso, toma su valor de la columna Link del registro
ENTRADA_1 (los links que proporcionamos como datos en el archivo Links.txt).
Nota: Emplear una columna temporal tiene el objeto principal de facilitar el
entendimiento del ejemplo, aunque en este caso, tambin mejora el rendimiento y
reduce el tiempo de ejecucin del script, veamos por que:
La descarga el html de la pgina toma cierto tiempo, debido a que CSV Robot debe
acceder a la web, y descargar el html de la pgina, y dependiendo de la congestin de
la red, la velocidad de conexin que disponemos, y otros factores, esto puede tomar
mas o menos tiempo.
Si descargramos por ejemplo el html de la pgina directamente en la columna
Nombre, y luego procesamos esa columna para extraer la informacin necesaria al
nombre del producto, luego de obtenido el nombre del producto, el contenido original
descargado de la pagina se habra destruido, y lo necesitamos nuevamente para
extraer la informacin de precio, lo cual nos obligara a descargar nuevamente el
html completo en la columna precio, y luego procesar nuevamente, con lo cual las
demoras originadas del acceso a la web se duplican. El empleo de una columna
temporal, nos permite realizar una nica descarga, y disponer de esa informacin
para extraer todo lo que nos interesa. Finalmente, la columna temporal se eliminar
para evitar que aparezca en el archivo de salida.
Ahora, procederemos a extraer la informacin de Nombre del producto. Para ello,
veamos nuevamente la estructura de la pgina html para definir que parmetros emplear
en el proceso EXTRAER_TEXTO para recuperar la informacin til:
.<div class="product-name" sourceindex="128"
siber__q92dpb7seovvtbh5__vptr="11a2f20"><h1 sourceindex="129"
siber__q92dpb7seovvtbh5__vptr="11a01b0">Ramos W19 V2.0 Tablet PC Android
4.0.3 Cortex A9 Dual Camera 8GB</h1></div>.
Pagina 42
Aqu tenemos el inconveniente de que las partes de texto coloreadas en rojo cambian
entre distintos productos. Lo que se mantiene es lo que est en azul.
Lo que a primera vista parece mas lgico para extraer el nombre del producto sera
definir el proceso EXTRAER_TEXTO de forma que extraiga el texto contenido entre
> y </h1>:
.<div class="product-name" sourceindex="128"
siber__q92dpb7seovvtbh5__vptr="11a2f20"><h1 sourceindex="129"
siber__q92dpb7seovvtbh5__vptr="11a01b0">Ramos W19 V2.0 Tablet PC Android
4.0.3 Cortex A9 Dual Camera 8GB</h1></div>.
con lo cual, el resultado de la extraccin sera Ramos W19 V2.0 Tablet PC Android
4.0.3 Cortex A9 Dual Camera 8GB.
Se puede hacer de esta manera, pero lo mas probable es que no resulte de la forma
esperada.
Por que?:
La etiqueta <h1></h1> se emplea en html para definir un titulo de cierto tamao, y es
muy probable que el formato >TEXTO</h1> se encuentre varias veces en
la misma pgina. Si intentamos extraer informacin de una pgina completa html solo
definiendo que la informacin est contenida entre > y </h1>, el proceso recuperar
el primer texto que encuentre entre esas etiquetas, y es muy probable que el resultado no
sea lo que estamos buscando. Para que el proceso tenga xito, debemos hacer la
bsqueda en varias etapas, para acercarnos a la informacin que nos interesa y evitar
errores.
La etiqueta <div> tambin es muy comn, por lo que si especificamos la extraccin
entre <div y </div> obtendremos el primer elemento DIV del html y es muy
probable que no sea lo que estamos buscando.
Lo que haremos es intentar proporcionar la mayor cantidad de informacin posible al
proceso de extraccin, para que identifique exactamente la porcin de texto que nos est
interesando recuperar.
Analizando la estructura de la pgina que empleamos en el ejemplo, vemos que el
elemento html DIV en el que se encuentra el nombre del producto, emplea el atributo
class=product-name (No entraremos en detalles de html y Css, solo diremos que este
atributo se emplea para asignar un formato de color, tipo de letra, etc. al elemento). Este
atributo, SOLO SE APLICA al DIV en el que esta el nombre del producto, por lo que
nos es de utilidad para discriminar este DIV como nico en la pgina.
El primer proceso de extraccin ser el siguiente:
<EXTRAER_TEXTO_DESDE_TEXTO>
(1)
TEXTO = "<% SALIDA:TEMP_HTML %>"
(2)
COLUMNA = "Nombre"
(3)
TAG_INICIO = "<div class=\"product-name\""
(4)
TAG_FINAL = "</div>"
</EXTRAER_TEXTO_DESDE_TEXTO>
Aqu estamos definiendo:
1- El texto a procesar se encuentra en la columna TEMP_HTML del registro de
SALIDA (columna que fue creada previamente por el proceso DESCARGAR_HTML).
Pagina 43
Pagina 44
Pagina 45
Pagina 46
Pagina 47
TAG_FINAL = "</h1>"
</EXTRAER_TEXTO_DESDE_TEXTO>
<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA: Nombre %>"
COLUMNA = "Nombre"
TAG_INICIO = ">"
TAG_FINAL = ""
</EXTRAER_TEXTO_DESDE_TEXTO>
<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA:TEMP_HTML %>"
COLUMNA = "Precio"
TAG_INICIO = "<span class=\"price\">"
TAG_FINAL = "</span>"
</EXTRAER_TEXTO_DESDE_TEXTO>
<QUITAR_COLUMNA>
COLUMNA = "TEMP_HTML"
</QUITAR_COLUMNA >
</PROCESOS>
</ROOT>
Pagina 48
Pagina 49
<PROCESOS>
<CREAR_ARCHIVO>
NOMBRE_DIRECTORIO = "Data"
NOMBRE_ARCHIVO = "Archivo.txt"
CONTENIDO_ARCHIVO = "Test"
</ CREAR_ARCHIVO >
</PROCESOS>
.
Lo cual no tiene mucho sentido, porque en cada ciclo de ejecucin, se crear el mismo
archivo Archivo.txt, con el mismo contenido Test, y en el mismo directorio Data,
por lo cual al terminar la ejecucin del script, se encontrar un nico archivo creado,
O se puede emplear la sintaxis de direccionamiento indirecto como se ver en el
ejemplo:
5.3.1 Ejemplo 8 Creacin de archivos
Este ejemplo es una continuacin del ejemplo 7. Vamos a ampliar el ejemplo, ahora
descargando la descripcin completa de cada producto desde la pgina web, pero a esa
descripcin descargada la almacenaremos en el directorio del producto (creado en el
ejemplo 7) en un archivo llamado descripcin.html
Primero veamos como descargamos la descripcin.
Si entramos a alguno de los productos de la pgina (emplearemos la misma direccin de
ejemplo que hemos empleado hasta el momento):
http://www.e-crazydeals.com/store/index.php/ramos-w19-v2-0-tablet-pc-android-4-0-3cortex-a9-dual-camera-8gb.html
Y empleamos la funcin Inspeccionar Elemento de google chrome para ver la
estructura de la pgina, podemos observar que la descripcin del producto es una tabla
html de la forma:
Pagina 50
<table border="1" cellpadding="0" cellspacing="0" width="649" style="bordercollapse:collapse" ;="" border-spacing:="" 0;="" empty-cells:="" show;="" fontsize:="" 100%="">
<tbody>
</tbody>
</table>
Siempre es recomendable, si vamos a descargar informacin de varias pginas, recorrer
cada una de ellas y verificar cuales son las estructuras html que se repiten en todas, para
a partir de ellas, armar los procesos de extraccin y asegurarnos de que podremos
recuperar la informacin sin importar a qu pgina de producto ingresamos. En este
caso, es sencillo porque esta es la nica tabla que posee la pgina.
El proceso de extraccin para esta tabla es el siguiente:
<EXTRAER_TEXTO_DESDE_TEXTO>
(1)
TEXTO = "<% SALIDA:TEMP_HTML %>"
(2)
COLUMNA = "TEMP_DESCRIPCION"
(3)
TAG_INICIO = "<table border=\"1\""
(4)
TAG_FINAL = "</table>"
(5)
INCLUIR_TAGS = "1"
</EXTRAER_TEXTO_DESDE_TEXTO>
Aqu estamos definiendo:
1- El texto a procesar se encuentra en la columna TEMP_HTML del registro
SALIDA (ver ejemplo 6).
2 El resultado de la extraccin se almacenar en una columna temporal
TEMP_DESCRIPCION del registro SALIDA. Se emplea una columna temporal porque
necesitamos un almacenamiento para luego crear el archivo con su contenido. Esta
columna se eliminar antes de terminar el script
3 y 4 El texto a extraer es el que se encuentra entre <table border="1" y </table> aqu
tambin aplica la necesidad de anteponer \ a todas las comillas dobles que forman
parte del valor del parmetro TAG_.
5 Como lo que estamos extrayendo es una tabla HTML, y nos interesa recuperarla
completa, se agrega la opcin INCLUIR_TAGS = "1", con lo cual, luego de extraer el
texto, se aaden los tags inicial y final para mantener la tabla completa.
Al ejecutar este proceso, obtenemos la tabla html en la columna
TEMP_DESCRIPCION. Ahora crearemos el archivo con el contenido de esa columna:
<CREAR_ARCHIVO>
(1)
NOMBRE_DIRECTORIO = "<% ENTRADA_1:ID %>"
(2)
NOMBRE_ARCHIVO = "Descripcion.html"
(3)
CONTENIDO_ARCHIVO = "<% SALIDA:TEMP_DESCRIPCION%>"
</ CREAR_ARCHIVO >
Aqu estamos definiendo:
Pagina 51
Pagina 52
Pagina 53
Pagina 54
Pagina 55
Pagina 56
Pagina 57
Pagina 58
</EXTRAER_TEXTO_DESDE_TEXTO>
; Crear directorio y nombrarlo con el valor de
; la columna ID de ENTRADA_1
; -------------------------------------<CREAR_DIRECTORIO>
NOMBRE_DIRECTORIO = "<% ENTRADA_1:ID %>"
</CREAR_DIRECTORIO>
; Crear archivo con Descripcion.html, con el
; contenido de la columna TEMP_DESCRIPCION,
; en el directorio creado previamente
; -------------------------------------<CREAR_ARCHIVO>
NOMBRE_DIRECTORIO = "<% ENTRADA_1:ID %>"
NOMBRE_ARCHIVO = "Descripcion.html"
CONTENIDO_ARCHIVO = "<%
SALIDA:TEMP_DESCRIPCION %>"
</ CREAR_ARCHIVO >
; Descargar archivo desde el link indicado en
; TEMP_IMAGEN, guardarlo en el directorio creado
; previamente, y con nombre Img_principal.jpg
; -------------------------------------<DESCARGAR_ARCHIVO>
NOMBRE_DIRECTORIO = "<% ENTRADA_1:ID %>"
NOMBRE_ARCHIVO = "Img_principal.jpg"
LINK = "<% SALIDA:TEMP_IMAGEN %>"
</ DESCARGAR_ARCHIVO >
; Eliminar columna TEMP_HTML
; -------------------------------------<QUITAR_COLUMNA>
COLUMNA = "TEMP_HTML"
</QUITAR_COLUMNA >
; Eliminar columna TEMP_DESCRIPCION
; -------------------------------------<QUITAR_COLUMNA>
COLUMNA = "TEMP_DESCRIPCION"
</QUITAR_COLUMNA >
; Eliminar columna TEMP_IMAGEN
; -------------------------------------<QUITAR_COLUMNA>
COLUMNA = "TEMP_IMAGEN"
</QUITAR_COLUMNA >
</PROCESOS>
</ROOT>
Pagina 59
6. Procesos Avanzados
6.1 Proceso EXTRAER_ARRAY_DESDE_TEXTO
Seguramente, al conocer el proceso EXTRAER_TEXTO_DESDE_TEXTO, se habr
preguntado: por que ese nombre? Por que no llamarlo simplemente
EXTRAER_TEXTO, que refleja perfectamente la funcin que realiza? A partir de esta
seccin, se responde a esa pregunta. El proceso que veremos a continuacin es una
variante de EXTRAER_TEXTO. Empezaremos por examinar la necesidad, y que es lo
que se puede y no se puede hacer con un proceso de extraccin simple de texto para ver
como podemos solucionarlo:
En el ultimo ejemplo (Ejemplo 9) se emple el proceso EXTRAER_TEXTO para
obtener el link de la imagen del producto del cual se desea extraer informacin de
inters, y luego, el proceso DESCARGAR_ARCHIVO, para descargar esa imagen a
disco. La pregunta que luego surge naturalmente es: Y si deseo descargar todas las
imgenes del producto?
Obviamente, para descargar las imgenes, necesitaremos los links de las mismas. Si
accedemos al link del producto que hemos estado empleando como ejemplo hasta ahora:
http://www.e-crazydeals.com/store/index.php/ramos-w19-v2-0-tablet-pc-android-4-0-3cortex-a9-dual-camera-8gb.html
Y analizamos la estructura de la pgina, veremos, por ejemplo, el html de la primera
imagen:
<li sourceindex="166">
<a href="#" onclick="popWin('http://www.ecrazydeals.com/store/index.php/catalog/product/gallery/id/33/image/263/', 'gallery',
'width=300,height=300,left=0,top=0,location=no,status=yes,scrollbars=yes,resizable=ye
s'); return false;" title="" sourceindex="167"><img src="http://www.ecrazydeals.com/store/media/catalog/product/cache/1/thumbnail/56x/9df78eab33525d08
d6e5fb8d27136e95/1/_/1_28.jpg" width="56" height="56" alt=""
sourceindex="168"></a>
</li>
Y el de la tercera imagen:
<li sourceindex="172">
<a href="#" onclick="popWin('http://www.ecrazydeals.com/store/index.php/catalog/product/gallery/id/33/image/265/', 'gallery',
'width=300,height=300,left=0,top=0,location=no,status=yes,scrollbars=yes,resizable=ye
s'); return false;" title="" sourceindex="173"
siber__q92dpb7seovvtbh5__vptr="6bfab60"><img src="http://www.ecrazydeals.com/store/media/catalog/product/cache/1/thumbnail/56x/9df78eab33525d08
d6e5fb8d27136e95/6/_/6_26.jpg" width="56" height="56" alt="" sourceindex="174"
siber__q92dpb7seovvtbh5__vptr="6bfac50"></a>
</li>
Pagina 60
El comportamiento de esta web es muy particular, y sirve muy bien de ejemplo para ver
los desafos con los que nos podemos encontrar cuando estamos escribiendo un script de
web scraping para CSV Robot.
Los fragmentos de HTML extrados de la pgina, poseen dos urls, la primera se resalto
en rojo y la segunda en azul. La segunda direccin apunta a una imagen, pero no es la
que estamos buscando, ya que si copiamos la direccin y la pegamos en el navegador,
accedemos a una imagen muy pequea del producto (una miniatura o thumbnail) que es
la que se emplea para armar la pagina y agilizar la carga. Cuando el usuario hace click
en la imagen en miniatura, un fragmento de cdigo javascript incrustado en el html
(onclick="popWin) abre una ventana en forma de popup, con la direccin url
resaltada en rojo. Dentro de esa nueva ventana si se encuentra la imagen que estamos
buscando.
Lo que vamos a hacer es hacer click en la imagen, para que se abra la nueva ventana, y
copiamos el html de la imagen que nos interesa.
Comparamos:
El fragmento HTML de la pagina del producto:
<li sourceindex="166">
<a href="#" onclick="popWin('http://www.ecrazydeals.com/store/index.php/catalog/product/gallery/id/33/image/263/', 'gallery',
'width=300,height=300,left=0,top=0,location=no,status=yes,scrollbars=yes,resizable=ye
s'); return false;" title="" sourceindex="167"><img src="http://www.ecrazydeals.com/store/media/catalog/product/cache/1/thumbnail/56x/9df78eab33525d08
d6e5fb8d27136e95/1/_/1_28.jpg" width="56" height="56" alt=""
sourceindex="168"></a>
</li>
Y un fragmento del HTML de imagen que nos interesa en la pgina que se despliega
como popup al hacer click en la miniatura:
<img src="http://www.ecrazydeals.com/store/media/catalog/product/cache/1/image/9df78eab33525d08d6e5fb8
d27136e95/1/_/1_28.jpg" width="500" alt="" title="" id="product-gallery-image"
class="image" sourceindex="41" siber__q92dpb7seovvtbh5__vptr="60be9c0">
.
Muy interesante!!!!, entre el link de la imagen en miniatura, y la imagen real que nos
interesa, solo cambia el fragmento resaltado en color rojo!!!!.
Obviamente, antes de apresurarnos, verificamos que suceda lo mismo con distintos
productos, y descubrimos que si, ocurre lo mismo.
Nota: Esta es la mayor complicacin del web scraping. CSV Robot proporciona
herramientas muy sencillas y potentes para extraer la informacin que nos interesa,
pero es tarea del usuario, analizar la estructura de la pgina para determinar donde
se encuentra la informacin que se necesita y como extraerla. Los ejemplos de web
scraping que se presentan en este manual son orientativos, a modo de presentar el
anlisis necesario para determinar como escribir el script de CSV Robot.
Pagina 61
Quiere decir que afortunadamente, podemos obtener el link real de la imagen que nos
interesa extraer, a partir del link de su miniatura. Como lo haramos?
Podemos emplear como parmetros delimitadores del proceso EXTRAER_TEXTO:
<img src="http://www.ecrazydeals.com/store/media/catalog/product/cache/1/thumbnail/56x/9df78eab33525
d08d6e5fb8d27136e95/6/_/6_26.jpg" width="56" height="56" alt=""
sourceindex="174" siber__q92dpb7seovvtbh5__vptr="6bfac50">
Eso nos permitira obtener el link de la miniatura (deberemos emplear tambin el
parmetro INCLUIR_TAGS, para no destruir el link en el proceso de extraccin), y
luego, aplicando Reemplazo de texto, reemplazamos la parte thumbnail/56x por
image, y obtenemos el link de la imagen real, que empleamos para descargarla al
disco.
Parece lgico, pero hay 2 problemas con todo esto:
1 El patrn de texto html que deseamos extraer se repite por cada imagen miniatura
que posee el producto, y el proceso EXTRAER_TEXTO_DESDE_TEXTO, recupera
solo la primera aparicin, e ignora las siguientes
2 No todos los productos poseen la misma cantidad de imgenes
Aqu es donde aparece una nueva familia de procesos disponibles en CSV Robot. Todos
se caracterizan por incluir en su nombre la palabra ARRAY
6.1.1 Que es un ARRAY?
Array, es un conjunto de valores del mismo tipo. Es un termino muy empleado en
lenguajes de programacin. Un array agrupa valores, por ejemplo, nombres de personas.
Jose,Luis,Pedro son valores, y pueden agruparse en un array de nombres.
6.1.2 Como se emplean los ARRAYS en CSV Robot?
Como sabemos, en un registro, ya sea uno de los registros de entrada, o el registro de
salida, se encuentran definidas columnas, o campos, y en cada columna se almacena un
nico valor. Con esta regla en mente, tratemos de imaginar como podramos extraer
links de imgenes y guardarlos en columnas de los registros.
Podramos en el script crear una columna para cada link a extraer:
Producto,Link,Imagen1,Imagen2,Imagen3
Tablet NN,www,1.jpg,2.jpg,3.jpg
El problema, que ya se comento, es que los productos no poseen la misma cantidad de
imgenes. Otra regla general de los archivos CSV, es que todos los registros del archivo
deben contener el mismo numero de columnas, entonces, como extraemos una cantidad
variable de datos (en este caso links de imgenes a descargar) y la almacenamos en un
registro, sin violar esta regla fundamental?
Para lograr esto, CSV Robot define el termino Array como un conjunto de valores que
se encuentran almacenados en una sola columna.
Para almacenar un conjunto de valores en un espacio nico, CSV Robot emplea el
carcter , como delimitador de valores.
Pagina 62
Pagina 63
construye un array (colocando todos los valores encontrados, y separndolos por ,).
Obsrvese que si el proceso EXTRAER_ARRAY_DESDE_TEXTO encuentra una
nica coincidencia de texto a extraer entre los tags proporcionados, el resultado
generado, al ser un array de un nico elemento, es idntico al resultado que se habra
obtenido de aplicar el proceso EXTRAER_TEXTO_DESDE_TEXTO.
Veamos un ejemplo
Supongamos que poseemos el siguiente texto en la columna TEMP del registro de
salida:
<p>Este es el prrafo 1</p><p>Este es el prrafo 2</p><p>Este es el prrafo 3</p>
Es algo muy comn en documentos HTML.
Supongamos que aplicamos el proceso EXTRAER_TEXTO_DESDE_TEXTO para
recuperar el fragmento contenido entre <p> y </p> y colocarlo en la columna
PARRAFOS del registro de salida
El proceso sera el siguiente:
<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA:TEMP %>"
COLUMNA = "PARRAFOS"
TAG_INICIO = "<p>"
TAG_FINAL = "</p"
</EXTRAER_TEXTO_DESDE_TEXTO>
Como EXTRAER_TEXTO_DESDE_TEXTO extrae solamente la primera coincidencia
contenida entre los TAGS proporcionados, luego de ejecutar, la columna PARRAFOS
contendr:
Este es el prrafo 1
Si ahora en cambio empleamos el proceso EXTRAER_ARRAY_DESDE_TEXTO, con
los mismos parmetros a CSV Robot, le estamos indicando que ahora no queremos
extraer un nico valor, sino un conjunto de todos los valores que encuentre delimitados
entre los TAGS proporcionados como parmetros:
<EXTRAER_ARRAY_DESDE_TEXTO>
TEXTO = "<% SALIDA:TEMP %>"
COLUMNA = "PARRAFOS"
TAG_INICIO = "<p>"
TAG_FINAL = "</p"
</EXTRAER_ARRAY_DESDE_TEXTO>
El resultado obtenido en la columna PARRAFOS ser:
Este es el prrafo 1,Este es el prrafo 2,Este es el prrafo 3
Pagina 64
Nota Importante: Como los procesos que trabajan con Arrays emplean el carcter ,
como delimitador para separar los valores de cada elemento del array, se aplican
automticamente todas las reglas vistas de comillas dobles para evitar problemas con
los archivos CSV Generados. En el ejemplo, si el archivo CSV de SALIDA emplea
como delimitador el carcter , entonces la columna PARRAFOS ser escrita en
dicho archivo encerrada entre comillas dobles, para que los delimitadores internos
del array no se confundan con los delimitadores del archivo CSV.
6.1.4 Ejemplo 10 Extraer Array de links
Vamos a continuar con el ejemplo 9 acercndonos en cada paso a una aplicacin real y
compleja de web scraping y procesamiento CSV. Sobre los ejemplos vistos hasta el
momento, aadiremos la extraccin de los links de las imgenes del producto, y a
dichos links, que como se saben corresponden a las imgenes en miniatura, les
aplicaremos un proceso de reemplazo de texto para obtener los links de las imgenes
reales.
El proceso de extraccin de los links lo aplicamos luego de la extraccin de la imagen
principal que realizamos en el ejemplo 9
<EXTRAER_ARRAY_DESDE_TEXTO>
TEXTO = "<% SALIDA:TEMP_HTML %>"
COLUMNA = "TEMP_IMAGENES"
TAG_INICIO = "http://www.ecrazydeals.com/store/media/catalog/product/cache/"
TAG_FINAL = ".jpg"
INCLUIR_TAGS = "1"
</EXTRAER_ARRAY_DESDE_TEXTO>
Ntese que aprovechamos que la URL de las imgenes comienza siempre de la misma
manera para emplearla como delimitador para la bsqueda y extraccin. De igual
manera, como necesitamos dicha URL completa, agregamos la opcin
INCLUIR_TAGS, para que los mismos delimitadores empleados formen parte de los
valores extrados.
Y luego, sobre los URLs extrados aplicamos el reemplazo de texto con repeticin
<REEMPLAZAR_TEXTO_EN_TEXTO>
TEXTO = "<% SALIDA:TEMP_IMAGENES %>"
COLUMNA = "TEMP_IMAGENES"
BUSCAR = "thumbnail/56x"
REEMPLAZAR = "image"
REPETIR = "100"
</REEMPLAZAR_TEXTO_EN_TEXTO>
Este ejemplo lo terminamos en este paso, para que se pueda observar, en el archivo
CSV de salida el array de links generado. En ejemplos posteriores emplearemos ese
array de links para descargar las imgenes, y luego eliminaremos la columna
TEMP_IMAGENES, para que no aparezca en el archivo de salida.
Pagina 65
Esta es la transcripcin completa del script del ejemplo 10. Se han resaltado con color
los procesos aadidos para este ejemplo:
<ROOT>
; Parametros de Configuracion
; --------------------------------------------------------------<CONFIG>
ARCHIVO_ENTRADA_1 = "Links.txt"
ARCHIVO_SALIDA = "Salida.txt"
</CONFIG>
; LISTA DE PROCESOS
; --------------------------------------------------------------<PROCESOS>
;Copiar columna ID desde ENTRADA_1 a SALIDA
; -------------------------------------<SETEAR_VALOR_COLUMNA>
COLUMNA = "ID"
VALOR = "<% ENTRADA_1:ID %>"
</SETEAR_VALOR_COLUMNA>
; Descargar HTML empleando como link la columna
; Link de ENTRADA_1
; El HTML descargado se almacena en la columna
; TEMP_HTML de SALIDA
; -------------------------------------<DESCARGAR_HTML>
COLUMNA = "TEMP_HTML"
LINK = "<% ENTRADA_1:Link %>"
</DESCARGAR_HTML>
; Extraer el nombre del producto del
; html descargado
; -------------------------------------<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA:TEMP_HTML %>"
COLUMNA = "Nombre"
TAG_INICIO = "<div class=\"product-name\""
TAG_FINAL = "</div>"
</EXTRAER_TEXTO_DESDE_TEXTO>
<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA: Nombre %>"
COLUMNA = "Nombre"
TAG_INICIO = ">"
TAG_FINAL = "</h1>"
</EXTRAER_TEXTO_DESDE_TEXTO>
Pagina 66
<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA: Nombre %>"
COLUMNA = "Nombre"
TAG_INICIO = ">"
TAG_FINAL = ""
</EXTRAER_TEXTO_DESDE_TEXTO>
; Extraer el Precio del producto del html
; descargado a la columna "Precio"
; -------------------------------------<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA:TEMP_HTML %>"
COLUMNA = "Precio"
TAG_INICIO = "<span class=\"price\">"
TAG_FINAL = "</span>"
</EXTRAER_TEXTO_DESDE_TEXTO>
; Extraer descripcion del producto del html
; descargado a la columna "TEMP_DESCRIPCION"
; -------------------------------------<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA:TEMP_HTML %>"
COLUMNA = "TEMP_DESCRIPCION"
TAG_INICIO = "<table border=\"1\""
TAG_FINAL = "</table>"
INCLUIR_TAGS = "1"
</EXTRAER_TEXTO_DESDE_TEXTO>
; Extraer link de la imagen principal
; del producto a la columna "TEMP_IMAGEN"
; -------------------------------------<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA:TEMP_HTML %>"
COLUMNA = "TEMP_IMAGEN"
TAG_INICIO = "<p class=\"product-image"
TAG_FINAL = "</p>"
</EXTRAER_TEXTO_DESDE_TEXTO>
<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA:TEMP_IMAGEN %>"
COLUMNA = "TEMP_IMAGEN"
TAG_INICIO = "http://www"
TAG_FINAL = ".jpg "
INCLUIR_TAGS = "1"
</EXTRAER_TEXTO_DESDE_TEXTO>
; Extraer array de links de las imagenes en miniatura
; del producto a la columna "TEMP_IMAGENES"
; -------------------------------------<EXTRAER_ARRAY_DESDE_TEXTO>
Pagina 67
Pagina 68
<QUITAR_COLUMNA>
COLUMNA = "TEMP_HTML"
</QUITAR_COLUMNA >
; Eliminar columna TEMP_DESCRIPCION
; -------------------------------------<QUITAR_COLUMNA>
COLUMNA = "TEMP_DESCRIPCION"
</QUITAR_COLUMNA >
; Eliminar columna TEMP_IMAGEN
; -------------------------------------<QUITAR_COLUMNA>
COLUMNA = "TEMP_IMAGEN"
</QUITAR_COLUMNA >
</PROCESOS>
</ROOT>
Pagina 69
Pagina 70
crazydeals.com/store/media/catalog/product/cache/1/thumbnail/56x/9df78eab33525
d08d6e5fb8d27136e95/1/_/1_43.jpg" width="56" height="56" alt=""
sourceindex="168" siber__q92dpb7seovvtbh5__vptr="6bfa870"></a>
</li>
De donde se puede extraer el link de la imagen.
Vamos a repetir el ejemplo 10, pero obtendremos los datos de otra manera.
6.2.1 Ejemplo 11 Extraer Array desde Array
Emplearemos el mtodo que se ha recomendado a lo largo de todo este manual para lo
que es extraccin de informacin desde HTML, que consiste en identificar los bloques
fundamentales, y a partir de ah, realizar sucesivos procesos de extraccin hasta obtener
la informacin deseada. Los pasos sern los siguientes:
1 Descarga del HTML del producto (de ejemplos anteriores)
2 Extraccin de precio, nombre, etc. (ejemplos anteriores)
3 Se extrae el DIV de las imgenes del producto:
Para ello, se aplica un proceso EXTRAER_TEXTO_DESDE_TEXTO que recupere el
texto contenido entre <div class="more-views" y </div>.
4 Sobre el HTML obtenido se aplica un proceso
EXTRAER_ARRAY_DESDE_TEXTO, que recupere todos los elementos contenidos
entre <li y </li>. De este proceso se obtiene un array con todos los elementos li que
estaban contenidos en el elemento DIV.
5 Sobre el array obtenido del ejemplo anterior, se aplica el proceso
EXTRAER_ARRAY_DESDE_ARRAY, que procese cada elemento del array, obtenga
el contenido delimitado entre <img src=" y " (comillas dobles), y con los resultados
forme un nuevo array. Este array ya contiene los links de las miniaturas de las imgenes
del producto.
6 Aplicar un proceso de REEMPLAZO DE TEXTO para convertir dichos links en los
links de las imgenes de tamao real.
Si bien es un proceso mas largo, es mucho mas estructurado, porque se obtienen
elementos html y luego se busca y se extraen otros elementos html del interior, con lo
que el proceso se hace mas largo, pero a la vez mas mecnico y fcil de comprender.
Esta es la transcripcin completa del script del ejemplo 11. Se han resaltado con color
los procesos aadidos para este ejemplo:
<ROOT>
; Parametros de Configuracion
; --------------------------------------------------------------<CONFIG>
ARCHIVO_ENTRADA_1 = "Links.txt"
ARCHIVO_SALIDA = "Salida.txt"
</CONFIG>
; LISTA DE PROCESOS
; --------------------------------------------------------------<PROCESOS>
Pagina 71
Pagina 72
</EXTRAER_TEXTO_DESDE_TEXTO>
; Extraer descripcion del producto del html
; descargado a la columna "TEMP_DESCRIPCION"
; -------------------------------------<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA:TEMP_HTML %>"
COLUMNA = "TEMP_DESCRIPCION"
TAG_INICIO = "<table border=\"1\""
TAG_FINAL = "</table>"
INCLUIR_TAGS = "1"
</EXTRAER_TEXTO_DESDE_TEXTO>
; Extraer link de la imagen principal
; del producto a la columna "TEMP_IMAGEN"
; -------------------------------------<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA:TEMP_HTML %>"
COLUMNA = "TEMP_IMAGEN"
TAG_INICIO = "<p class=\"product-image"
TAG_FINAL = "</p>"
</EXTRAER_TEXTO_DESDE_TEXTO>
<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA:TEMP_IMAGEN %>"
COLUMNA = "TEMP_IMAGEN"
TAG_INICIO = "http://www"
TAG_FINAL = ".jpg "
INCLUIR_TAGS = "1"
</EXTRAER_TEXTO_DESDE_TEXTO>
; Extraer del HTML de la pagina los links de las
; imagenes del producto
; Primero extraer el div contenedor de las
; imagenes en TEMP_IMAGENES
; -------------------------------------<EXTRAER_TEXTO_DESDE_TEXTO>
TEXTO = "<% SALIDA:TEMP_HTML %>"
COLUMNA = "TEMP_IMAGENES"
TAG_INICIO = "<div class=\"more-views\""
TAG_FINAL = "</div>"
</EXTRAER_TEXTO_DESDE_TEXTO>
; del div obtenido, extraer un array con todos los
; elementos <li> contenidos en su interior
; -------------------------------------<EXTRAER_ARRAY_DESDE_TEXTO>
TEXTO = "<% SALIDA:TEMP_IMAGENES %>"
COLUMNA = "TEMP_IMAGENES"
TAG_INICIO = "<li"
Pagina 73
TAG_FINAL = "</li>"
</EXTRAER_ARRAY_DESDE_TEXTO>
; del array obtenido, procesar cada elemento extrayendo
; el link de la imagen que se encuentra en el interior
; los elementos resultantes de la extraccin se mantienen
; como array en TEMP_IMAGENES
; -------------------------------------<EXTRAER_ARRAY_DESDE_ARRAY>
TEXTO = "<% SALIDA:TEMP_IMAGENES %>"
COLUMNA = "TEMP_IMAGENES"
TAG_INICIO = "<img src=\""
TAG_FINAL = "\""
</EXTRAER_ARRAY_DESDE_ARRAY>
; En el array de links extraido, reemplazar "thumbnail/56x"
; por "image" en todos los links, para obtener los links
; de las imagenes a tamao real
; -------------------------------------<REEMPLAZAR_TEXTO_EN_TEXTO>
TEXTO = "<% SALIDA:TEMP_IMAGENES %>"
COLUMNA = "TEMP_IMAGENES"
BUSCAR = "thumbnail/56x"
REEMPLAZAR = "image"
REPETIR = "100"
</REEMPLAZAR_TEXTO_EN_TEXTO>
; Crear directorio y nombrarlo con el valor de
; la columna ID de ENTRADA_1
; -------------------------------------<CREAR_DIRECTORIO>
NOMBRE_DIRECTORIO = "<% ENTRADA_1:ID %>"
</CREAR_DIRECTORIO>
; Crear archivo con Descripcion.html, con el
; contenido de la columna TEMP_DESCRIPCION,
; en el directorio creado previamente
; -------------------------------------<CREAR_ARCHIVO>
NOMBRE_DIRECTORIO = "<% ENTRADA_1:ID %>"
NOMBRE_ARCHIVO = "Descripcion.html"
CONTENIDO_ARCHIVO = "<%
SALIDA:TEMP_DESCRIPCION %>"
</ CREAR_ARCHIVO >
; Descargar archivo desde el link indicado en
; TEMP_IMAGEN, guardarlo en el directorio creado
; previamente, y con nombre Img_principal.jpg
; -------------------------------------<DESCARGAR_ARCHIVO>
Pagina 74
Pagina 75
Pagina 76
Pagina 77
Pagina 78
Pagina 79
REEMPLAZAR = "image"
REPETIR = "100"
</REEMPLAZAR_TEXTO_EN_TEXTO>
; Crear directorio y nombrarlo con el valor de
; la columna ID de ENTRADA_1
; -------------------------------------<CREAR_DIRECTORIO>
NOMBRE_DIRECTORIO = "<% ENTRADA_1:ID %>"
</CREAR_DIRECTORIO>
; Crear archivo con Descripcion.html, con el
; contenido de la columna TEMP_DESCRIPCION,
; en el directorio creado previamente
; -------------------------------------<CREAR_ARCHIVO>
NOMBRE_DIRECTORIO = "<% ENTRADA_1:ID %>"
NOMBRE_ARCHIVO = "Descripcion.html"
CONTENIDO_ARCHIVO = "<%
SALIDA:TEMP_DESCRIPCION %>"
</ CREAR_ARCHIVO >
; Descargar archivo desde el link indicado en
; TEMP_IMAGEN, guardarlo en el directorio creado
; previamente, y con nombre Img_principal.jpg
; -------------------------------------<DESCARGAR_ARCHIVO>
NOMBRE_DIRECTORIO = "<% ENTRADA_1:ID %>"
NOMBRE_ARCHIVO = "Img_principal.jpg"
LINK = "<% SALIDA:TEMP_IMAGEN %>"
</ DESCARGAR_ARCHIVO >
; Descargar los archivos de imagenes del producto
; Los links de descarga provienen de un array en la
; columna TEMP_IMAGENES del registro de salida.
; -------------------------------------<DESCARGAR_ARCHIVOS_DESDE_ARRAY>
NOMBRE_DIRECTORIO = "<% ENTRADA_1:ID %>"
NOMBRE_ARCHIVO = ""
LINK = "<% SALIDA:TEMP_IMAGENES %>"
</DESCARGAR_ARCHIVOS_DESDE_ARRAY>
; Eliminar columna TEMP_HTML
; -------------------------------------<QUITAR_COLUMNA>
COLUMNA = "TEMP_HTML"
</QUITAR_COLUMNA >
; Eliminar columna TEMP_DESCRIPCION
; --------------------------------------
Pagina 80
<QUITAR_COLUMNA>
COLUMNA = "TEMP_DESCRIPCION"
</QUITAR_COLUMNA >
; Eliminar columna TEMP_IMAGEN
; -------------------------------------<QUITAR_COLUMNA>
COLUMNA = "TEMP_IMAGEN"
</QUITAR_COLUMNA >
; Eliminar columna TEMP_IMAGENES
; -------------------------------------<QUITAR_COLUMNA>
COLUMNA = "TEMP_IMAGENES"
</QUITAR_COLUMNA >
</PROCESOS>
</ROOT>
Pagina 81
Pagina 82