Universidad de Costa Rica
Escuela de Ciencias de la
Computación e Informática
Profesor Adolfo Di Mare
CI-1201
II Semestre 2012
[<=] [home] [<>] [\/] [=>]
CI-1201 Programación II

Tarea #4 [solución]

Lista de párrafos en documentos HTML

      Un documento HTML es un archivo de texto en el que aparecen marcas que definen cómo debe ser desplegado por el navegador (Mozilla, Opera, etc). Su programa html2par debe leer un conjunto de archivos de texto que tienen marcas HTML, las que usará para determinar cuáles son los párrafos que contiene. Usted debe crear en un lista los siguientes datos para cada párrafo: texto del párrafo, número de párrafo (secuencia), archivo del que proviene y también, lista de palabras significativas encontradas en el párrafo.

      Para extraer todos los datos, su programa debe eliminar la mayor parte de las etiquetas HTML del archivo que procesará. Es fácil reconocer una etiqueta HTML, pues siempre viene precedida por el caracter '<', como en el caso de <p align="center"> o de <h2>. Su programa usará un archivo de configuración en la que estarán definidas las etiquetas HTML que hay que usar para marcar el inicio del cada párrafo.

; html2par.cfg
; ============
par=p h1 h2 h3 h4 h5 h6 ; parrafo y marcas de encabezado
par=tr li dt            ; tablas y listas (falta td)
lt = á é í ó ú ñ Ñ ü
lt = &aacute; &eacute; &iacute; &oacute; &uacute; &ntilde; &Ntilde;
equiv= a|&aacute; e|&eacute; i|&iacute; o|&oacute; u|&uacute;
equiv= n|&ntilde; N|&Ntilde; u|&uuml;
del= a e i o u h
ignr=a ante bajo cabe con contra ; ...
ignr=el la los las e

      Si un párrafo no contiene texto, su programa debe ignorarlo, de manera que en la lista solo queden párrafos que sí contienen algún texto. Además, su programa debe ignorar cualquier argumento para la estiqueta HTML. Por ejemplo, su programa debe ignorar el argumento align="center" en la etiqueta <p align="center">. Las etiquetas que marcan el principio de un párrafo son las definidas por la llave par en el archivo de configuración. Para ejecutar su programa, de manera que procese recursivamente el directorio actual y todos sus subdirectorios, use como primer parámetro el nombre del archivo de configuración:

X:\DIR\SubDir> html2par.exe html2par.cfg *.htm*

      En los documentos HTML las letras tildadas del español son caracteres especiales, pues no tienen un código ASCII asociado, por lo que un programa que procese texto las podría tomar como una marca que separa palabras. Su programa evita este comportamiento si la letra aparece asociada a la llave [lt] en el archivo de configuración, en donde se indica que esos caracteres, ya sean simples como 'á' o compuestos como &aacute;, forman parte de las palabras.

      Asociado a cada párrafo, su programa debe contruir una lista que contiene las palabras clave del párrafo. Esta lista está compuesta de parejas <palabra,#> que indica cuál es la palabra que aparece en el párrafo junto con un número que indica cuántas veces aparece. Como cada palabra puede aparecer varias veces en el párrafo, en la lista de palabras también hay que apuntar la cantidad de veces que esa palabra aparece en el párrafo (por eso la lista no tiene duplicados).

      Para evitar que las letras con acentos sean consideradas como diferentes a las letras sin acentos, al procesar una palabra su programa debe aplicar las sustituciones definidas en la llave [equiv]: si aparece a|&aacute; hay que remplazar la letra &aacute; por 'a' (y si aparece &aacute;|a la sustitución es a la inversa 'a' por &aacute;). Además, html2par debe ignorar las diferencias entre mayúsculas y minúsculas y debe eliminar palabras mencionadas en la llave [ignr]. Más aún, antes de determinar si una palabra es o no una palabra clave, su programa debe eliminar las letras que aparecen asociadas a la llave [del]. Por ejemplo, suponga que el párrafo a procesar es este:

<p align="center">
Cabe más decir que no te hab&iacute;a amado
que en el amor te había dejado.</p>
<h3>

      Como los argumentos que aparecen en las marcas que definen un párrafo deben ser ignorados, y además en archivo de configuración está definido que letras tildadas son similares a las no tildadas, este párrafo produce las mismas llaves que este otro:

<p>
Cabe mas decir que no te habia amado
que en el amor te habia dejado.</p>
<h3>

      En la llave [ignr] están definidas las palabras que deben ser excluidas de las palabras clave de párrafo (eliminación de las palabras "Cabe" y "el"):

<p>
mas decir que no te habia amado
que en amor te habia dejado.</p>
<h3>

      En la llave [del] se ha definido que hay que eliminar las letras { a e i o u h }, y como también hay que ignorar las diferencias entre mayúsculas y minúsculas, por lo que este párrafo produce las mimas llaves que el siguiente:

<p>
dcr q n t b md
q n l mr t b djd.</p>
<h3>

      Para obtener la lista de palabras clave, una técnicas sencilla es ordenar las palabras del párrafo y contar repetidos. Al ordenar { dcr q n t b md q n l mr t b djd } se obtiene la secuencia { b b dcr djd l md mr n n q q t t } por lo que la lista de palabras clave de este párrafo es { <b,2> <dcr,1> <djd,1> <l,1> <md,1> <mr,1> <n,2> <q,2> <t,2> }. Aunque su programa asocia a este párrafo estas palabras clave, debe guardar el texto completo del párrafo en la lista general, de manera que sea posible identificar el párrafo de donde vienen las palabras clave.


Consulta:
Profe: me parece tonto que trate todas las vocales como si fueran la misma cosa, porque después uno busca por la llave "cola" y le salen párrafos que contienen "c*lo". ¿No es mejor quitar esas equivalencias?
Respuesta:
El ejemplo es jocoso, pero la capacidad de hacer sustituciones de hileras es un buen ejercicio de programación.
Consulta:
Profe: Mi programa ya crea la lista de palabras para cada párrafo. ¿Qué le parece si hago que mi programa grabe primero el párrafo, y luego la lista de palabras (junto con la cantidad de veces que aparece). ¿Prefiere que deje todo eso en un archivo o simplemente imprimo en la consola?
Respuesta:
Grabalo todo en la consola. Me parece que lo más cómodo es separar cada párrafo del siguiente usando un renglón que contenga montones de iguales consecutivos (===========).

Consulta:
Profe: no entendemos muy bien como determinar donde inicia y donde termina cada párrafo. Según los ejemplos del enunciado de la tarea, un párrafo sería así, en donde el párrafo comienza con <p>:
<p>
Cabe mas decir que no te habia amado
que en el amor te habia dejado.</p>
<h3>
Respuesta:
Así es. La etiqueta <p> es una de las que aparece en el renglón "par" en el archivo de configuración "html2par.cfg" y por eso marca el principio de un párrafo.
Consulta:
En ese mismo párrafo, el final está marcado con </p> (párrafo número tres ya que la etiqueta dice <h3>).
Respuesta:
Incorrecto. No hay marcas de "fin de párrafo". Solo hay marcas de principio de párrafo. Como tu programa remueve todas las etiquetas HTML, al removerlas ya no va a quedar ningún <p>, ni tampoco su </p> o <h3>. Sin embargo, como también ese <h3> aparece en el renglón "par" en el archivo de configuración "html2par.cfg", cada vez que <h3> aparece comienza un nuevo párrafo. Además, el número 3 en <h3> no es una numeración de párrafos pues las etiquetas desde <h1> hasta <h6> marcan encabezados.
Consulta:
Sin embargo, hemos abierto archivos HTML propios y no se parecen en nada a los ejemplos dados. ¿Que deberíamos hacer? Asumir que los archivos vienen con el formato simple que viene de ejemplo, o uno como el que se encuentra abajo. Este ejemplo representa un párrafo, sin embargo la etiqueta <hx> no está presente.
<p class=MsoNormal style='line-height:200%'><span lang=ES
style='mso-ansi-language: ES'><span style='mso-tab-count:1'>
</span></span>En el presente documento se encuentra la documentación
externa. También posee detalles específicos acerca del IDE de
preferencia y otros aspectos importantes.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<span style='mso-tab-count:1'></span>Asimismo, corresponde también a la
descripción de la cuarta tarea programada como tal perteneciente curso
de CI-1201, Programación II.</p>
Respuesta:
Si tu archivo HTML fue producido con una herramienta (como Word o writer), es posible que tenga montones y montones de etiquetas, las que deben ser removidas porque no aparecene en un el renglón "par" en el archivo de configuración "html2par.cfg". Si quitás las etiquetas HTML junto con sus parámetros todo eso queda en un solo párrafo:
En el presente documento se encuentra la documentación
externa. También posee detalles específicos acerca del IDE de
preferencia y otros aspectos importantes.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Asimismo, corresponde también a la
descripción de la cuarta tarea programada como tal perteneciente curso
de CI-1201, Programación II.
Además, como el &nbsp; no aparece mencionado en "html2par.cfg" hay que eliminarlo:
En el presente documento se encuentra la documentación externa. También
posee detalles específicos acerca del IDE de preferencia y otros
aspectos importantes. Asimismo, corresponde también a la descripción de
la cuarta tarea programada como tal perteneciente curso de CI-1201,
Programación II.

      Entregue su tarea por correo electrónico, como lo hizo anteriormente.

[mailto:] Entrega de Tareas

Tiempo de entrega: 7 días
Entregue su documentación en la primera fecha, y luego entregue el programa completo en la segunda fecha.
Segunda etapa: 3 días
Modalidad: En parejas

Soluciones

[mailto:] Adolfo Di Mare <adolfo@di-mare.com>.
Copyright © 2012
Derechos de autor reservados © 2012
[home] <> [/\]