diccionario-espanol-txt
diccionario-espanol-txt copied to clipboard
Significados
Sería increible poder extraer al menos un significado de cada palabra, opcionalmente, ¿lo has considerado?
Esta opcion estaria muy buena!
Es lo siguiente que voy a hacer. Si nos hemos portado bien en el 2022 los reyes majos nos lo traerán. (Esto último es una tontuna, referencia a una tradición de aquí de España). A ver si antes de que terminen las navidades saco una tarde para hacerlo.
Había pensado en estructurar directorios por comienzo de letra y un txt con todos los significados de cada palabra. a (dir) - a... - albatros.txt b (dir) ...
Si te sirve de algo, hace poco estuve trasteando para añadir las definiciones a una lista de verbos. Lo hice con BeautifulSoup y quería devolver la función con formato markdown para que respetara cursivas y demás, así que habrá parte del código que no te dirá gran cosa, pero lo incluyo.
import requests
from bs4 import BeautifulSoup
from markdownify import MarkdownConverter
def dle_rae(word):
'''Scrapea la definición de una palabra del DLE.
Para mantener el formato de cursivas, negritas, etc.,
se sustituyen las clases concretas.'''
url_rae = "https://dle.rae.es/"
url_definicion = f'{url_rae}{word}'
headers_dle = {'User-Agent': 'Mozilla/5.0'}
timeout_dle = 5 # segundos
try:
response_dle = requests.get(
url_definicion, headers=headers_dle, timeout=timeout_dle)
if response_dle.ok:
soup_dle = BeautifulSoup(response_dle.text, 'lxml')
# La definición está en la etiqueta <article> y solo hay una.
resultados = soup_dle.find('article')
# Si la palabra existe en el diccionario, tiene esa etiqueta.
if resultados is not None:
# eliminar la palabra que se define; no nos interesa.
title = resultados.find('header')
title.decompose()
# introducir '>' antes de cada línea para formato de callout md.
p_tags = resultados.find_all('p')
for p_tag in p_tags:
p_tag.insert(0, '>')
# cambiar a cursiva los ejemplos.
ejemplos = resultados.find_all('span', 'h')
for ejemplo in ejemplos:
ejemplo.name = 'em'
# cambiar a cursiva ciertas abreviaturas.
abbrs = resultados.find_all('abbr', 'c')
for abbr in abbrs:
abbr.name = 'em'
# cambiar a may. preposiciones de ejemplos.
preposiciones = resultados.find_all('span', 'i1')
for prepo in preposiciones:
prepo.string = prepo.text.upper()
# cambiar a negrita los números de acepción.
n_acep = resultados.find_all('span', 'n_acep')
for acep in n_acep:
acep.name = 'strong'
# cambiar hiperenlaces por negrita.
h_enlaces = resultados.find_all('a', 'a')
for enlace in h_enlaces:
enlace.name = 'b'
# cambiar locuciones y composiciones por negrita.
locuciones = soup_dle.find_all(has_class_k5_or_k6)
for locucion in locuciones:
locucion.insert_before('> \n')
# Convertimos el soup en formato markdown con este módulo.
# Es el único que me ha respetado correctamente todo el formato.
md_converter_dle = MarkdownConverter()
markdown_string_dle = md_converter_dle.convert_soup(resultados)
# eliminar los saltos innecesarios
markdown = markdown_string_dle.replace('\n\n', '\n')
markdown = markdown.replace('\n\n', '\n')
return markdown
else:
return 'No existe en el diccionario.'
else:
print('Mala respuesta para', url_definicion, response.status_code)
except requests.exceptions.ConnectionError as exc:
print(exc)
Hola! bueno solo comentar que he utilizado los txt generados en este proyecto https://github.com/jonaypelluz/jueletrado le metí un link en el readme, aparte he empezado a montar también un tema en python para sacar el primer significado de cada palabra para un juego de significados, no de todas claro por ahora de las basic_words, este lo generé con un script en go que ejecuto en la terminal. Bueno mi inicio de crawler de significados es muy básico.
import argparse
import re
import time
import random
from urllib.parse import quote
from urllib.request import Request, urlopen
from bs4 import BeautifulSoup
def get_html(url):
try:
time.sleep(random.randint(1, 10))
print(f"Fetching data for URL: {url}")
request = Request(url, headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'})
with urlopen(request) as response:
html_content = response.read().decode('utf-8')
return html_content
except Exception as e:
print(f"Failed to fetch data for URL {url}: {e}")
return None
def parse_html(html_content, word):
if html_content is None:
return f"{word} = failed"
soup = BeautifulSoup(html_content, 'html.parser')
paragraphs = soup.find_all('p')
for p in paragraphs:
[div.decompose() for div in p.find_all('div')]
first_span = p.find('span', class_='n_acep')
if first_span and first_span.get_text().strip() == "1.":
return f"{word} = {p.get_text()}"
print(f"No matching definition found for word: {word}")
return f"{word} = failed"
def main(word):
print(f"Processing word: {word}")
formatted_url = "https://dle.rae.es/{}".format(quote(word))
html_content = get_html(formatted_url)
result = parse_html(html_content, word)
with open('word_definitions.txt', 'a', encoding='utf-8') as file:
file.write(result + "\n")
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Fetch and parse HTML from the RAE dictionary.")
parser.add_argument("filename", help="The text file containing words to fetch from the RAE dictionary.")
args = parser.parse_args()
with open(args.filename, 'r', encoding='utf-8') as file:
for word in file:
word = word.strip()
if word:
main(word)
aunque la versión de NoaVelasco pinta mejor, si se necesita que haga algo pues os echo un cable. Saludos!