#!/usr/bin/env python
# -*- coding: utf-8 -*-
__date__ = "2012"
import urllib2
import time
import string
import cPickle as pickle
numero_registros = 0
CARACTERES_ESPECIALES = string.punctuation + string.whitespace
class Base(String):
def __init__(self):
self.coincidencias = []
def Dic(self, palabra):
"""Funcion base del programa."""
palabra = self.GetPalabraUnica(palabra)
if not palabra:
return
print ">>>", palabra
definicion = self.IsPalabra(palabra)
if not definicion:
if self.IsPalabraSinDefinicion(palabra):
print(">>> Palabra sin definicion!")
return
print(">>> Palabra no registrada. Buscando en la web........")
definicion = self.Buscar(palabra)
if not definicion:
print(">>> Palabra no encontrada!.. Algunas coincidencias:")
for pal in self.coincidencias:
print(pal)
return
self.RegistrarPalabra(palabra, definicion)
return definicion
def GetPalabraUnica(self, palabra):
"""Obtine la primera palabra indicada en caso de ser varias.. hasta
encontrar el primer caracter especial en ella en caso de"""
palabra_nueva = ""
for letra in palabra.lower().lstrip():
if letra in CARACTERES_ESPECIALES:
return palabra_nueva
palabra_nueva += letra
return palabra_nueva
def RegistrarPalabra(self, palabra, definicion):
"""Registra la palabra en el programa"""
global numero_registros
numero_registros += 1
archivo = file("registro.dat", "r")
registro = pickle.load(archivo)
archivo.close()
registro[palabra] = definicion
archivo = file("registro.dat", "w")
pickle.dump(registro, archivo)
archivo.close()
return True
def GetDefinicion(self, datos):
"""Obtine la definicion desde la pagina html fuente obtenida"""
corte1 = datos[datos.find('eAcep') : ]
definicion = corte1[corte1.find('eAcep')+8 : corte1.find('<')]
return definicion
def GetCoincidencia(self, datos):
"""Obtine las considencias debueltas por la pagina en caso de no haber
sido encontrada la palabra."""
pos = 0
self.coincidencias = []
for n in range(datos.count("LEMA")):
indice1 = string.find(datos, "LEMA=", pos)
indice2 = string.find(datos, " target=", pos)
palabra = datos[indice1+5 : indice2-1]
self.coincidencias.append(palabra)
pos = indice2+7
if len(str(self.coincidencias)) > 100:
self.coincidencias = []
return self.coincidencias
def IsPalabra(self, palabra):
"""Comprueba si la palabra ya esta registrada devolviendo su definicion.
en caso de no estar registrada devuelve False"""
try:
archivo = file("registro.dat", "r")
except IOError:
archivo = file("registro.dat", "w")
pickle.dump({}, archivo)
archivo.close()
return False
registro = pickle.load(archivo)
archivo.close()
try:
return registro[palabra.lower()]
except KeyError:
return False
def IsPalabraSinDefinicion(self, palabra):
try:
archivo = file("sin_definicion.dat", "r")
except IOError:
archivo = file("sin_definicion.dat", "w")
pickle.dump([], archivo)
archivo.close()
return
palabras = pickle.load(archivo)
archivo.close()
if palabra in palabras:
return True
def SetPalabraSinDefinicion(self, palabra):
"""Guarda la palabra en el archivo de las palabras sin definicion."""
archivo = file("sin_definicion.dat", "r")
palabras = pickle.load(archivo)
archivo.close()
palabras.append(palabra)
archivo = file("sin_definicion.dat", "w")
pickle.dump(palabras, archivo)
archivo.close()
def Buscar(self, palabra):
"""Realiza la busqueda de la palabra en la web
funcion solo para la web http://buscon.rae.es/"""
try:
#f = urllib2.urlopen("http://buscon.rae.es/draeI/SrvltGUIBusUsual?TIPO_HTML=2&TIPO_BUS=3&LEMA=%s" % palabra)
#f = urllib2.urlopen("http://buscon.rae.es/draeI/SrvltConsulta?TIPO_BUS=3&LEMA=%s" % palabra)
f = urllib2.urlopen("http://buscon.rae.es/draeI/SrvltGUIBusUsual?LEMA=%s&origen=RAE&TIPO_BUS=3" % palabra)
datos = f.read()
f.close()
except BaseException as e:
print("Error obteniendo resultados.. URLError")
print(e)
return
if datos.find("RC_NF") != -1:
print("La busqueda de la palabra no obtubo resultados!")
self.SetPalabraSinDefinicion(palabra)
return
if datos.find("eAcep") == -1:
print(u"Sin resultados!")
self.GetCoincidencia(datos)
return
return self.GetDefinicion(datos)
def GetPalabrasRegistradas(self):
"""Obtine las palabras registradas"""
archivo = file("registro.dat", "r")
registro = pickle.load(archivo)
archivo.close()
return registro.keys()
def GetCantidadPalabrasRegistradas(self):
"""Obtine la cantidad de palabras registradas"""
return len(self.GetPalabrasRegistradas())
dic = Base()
palabras_registradas = dic.GetPalabrasRegistradas()
numero_registros = len(palabras_registradas)
for palabra in palabras_registradas:
print(palabra)
print("Cantidad de palabras registradas: %d \n" % numero_registros)
def busqueda(palabra):
defi = dic.Dic(palabra)
return defi
def main(palabra):
defi = busqueda(palabra)
if not defi:
return
print defi
print("%d palabras registradas" % numero_registros)
palabras = defi.split(" ")
for pal in palabras:
pal1 = dic.IsPalabra(pal)
if pal1:
print pal, "(ya esta registrada)"
continue
print pal
try:
main(pal)
except RuntimeError:
break
return 0
while True:
main(raw_input("Buscar: ")
Definiciones de palabras en español con Python
Código fuente escrito en Python, que retorna el significado de la palabra que le indiquemos. En un principio la aplicación no consta de definiciones registradas, de modo que se conectará a la página de la Real Academia Española en busca del significado de dicha palabra para registrarla posteriormente. Al inicio actuara recurcivamente en busca del significado de cada una de las palabras contenidas en el texto de la definición obtenida, creando un registro bien amplio en un archivo 'registro.dat' del mismo directorio. Después de un tiempo, ya no será necesario la conexión a Internet para obtener las definiciones.