Member of The Internet Defense League Últimos cambios
Últimos Cambios
Blog personal: El hilo del laberinto Geocaching

Indexar páginas ZOPE ignorando tildes y HTML

Última Actualización: 30 de Enero de 2003 - Jueves

ZOPE incluye un potente motor de indexación y búsqueda de objetos, llamado ZCatalog. En este documento se describirá con detalle cómo utilizar esas funcionalidades para implementar un buscador capaz de indexar páginas en español, con las siguientes características:

  • El código HTML se ignora y no se indexará.

  • Las tildes se ignoran, a la hora de indexar y buscar. Es decir, las palabras "construcción" y "construccion" se considerarán equivalentes.

    Esta funcionalidad es interesante porque la ortografía, tanto en las páginas como en las búsquedas, no siempre es muy correcta...

ZCatalog realiza la indexación invocando métodos o atributos de los objetos a indexar. Es decir, para indexar el código fuente de un documento DTML, podemos indexar el atributo "raw", por ejemplo.

Asimismo, se aplican como siempre los mecanismos de adquisición de ZOPE, por lo que podemos tener definido un método a nivel global del sitio web, y ejecutarlo sobre cada uno de los objetos a indexar, sin que éstos tengan que proporcionar ningún tipo de soporte explícito adicional.

Los pasos que hay que dar para crear nuestro sistema de indexación serán:

  • Crearemos en el directorio raíz un "Script Python" llamado "castellano", por ejemplo, cuyo código fuente incluyo más abajo.

  • Se definirá el índice "castellano" en el ZCatalog. Como vocabulario podemos poner el "ISO-8859-1", incluído en ZOPE de forma estándar.

Al reindexar los objetos, ZCatalog intentará indexar el método "castellano", que no existe en los objetos normales pero que se "adquiere" del directorio raíz, mediante los mecanismos normales y automáticos de ZOPE.

El script Python en sí es:

texto=context(indexando=1)

# Eliminación de HTML
# http://www.argo.es/~jcea/artic/python-cadenas.htm
# Si en vez de un TextIndex se usa un ZCTextIndex, éste ofrece ya la modalidad
# de 'HTMLSplitter', y si la usamos podemos eliminar esta parte.
s=""
a=b=0
while a>=0 :
  a=texto.find("<",b)
  if a>=0 :
     s+=texto[b:a]
     b=texto.find(">",a)+1
if b : s+=texto[b:]
if s: texto=s

# Normalizacion de palabras
# Lo que sigue no consume apenas CPU
for i,j in (('a','á'),('e','é'),('i','í'),('o','ó'),('u','ú')) :
  texto=texto.replace(j,i)
  i=i.upper()
  j=j.upper()
  texto=texto.replace(j,i)

return texto

En la primera línea se procesa y genera la "vista" del objeto a indexar. A dicho objeto se le pasa la variable "indexando", que le advierte de que el resultado va a ser indexado. La mayoría de los objetos van a ignorar esa información, pero los objetos "inteligentes" pueden reconocerla para, por ejemplo, obviar el control de sesiones, creación de menús, o acciones colaterales. Es algo que el indexador indica y que el objeto indexado puede procesar o no, de forma discreccional.

En la siguiente sección de código se buscan y eliminan etiquetas HTML. Una etiqueta HTML empieza con un signo "menor" ("<") y termina con un signo "mayor" (">").

Es tremendamente importante que todos los signos "menor" ("<") presentes en el documento se correspondan a etiquetas HTML. Si ese signo debe aparecer en el texto en sí, debe usarse su "HTML encoding", que es "&lt;". Es importante también que el primer signo "mayor" (">") tras un "menor" se corresponda escrupulosamente con el cierre de la etiqueta HTML. Si es necesario que en medio de la etiqueta aparezca este símbolo, debe usarse también su "HTML encoding", que es "&gt;".

En el último segmento de código se eliminan las tildes, para que se reconozcan como iguales palabras como "solo" y "sólo".

Con estos pasos y este código, tendremos nuestro web indexado en un correcto castellano, y sin contaminar debido al HTML. A la hora de buscar es importante que el script de búsqueda elimine también las tildes, para lo que se puede usar este mismo código.



Python Zope ©2003 jcea@jcea.es

Más información sobre los OpenBadges

Donación BitCoin: 19niBN42ac2pqDQFx6GJZxry2JQSFvwAfS