JorgeDuenasLerin / diccionario-espanol-txt

Diccionario con las palabras del Español en formato txt
182 stars 49 forks source link

Significados #10

Open sergeiventurinov opened 1 year ago

sergeiventurinov commented 1 year ago

Sería increible poder extraer al menos un significado de cada palabra, opcionalmente, ¿lo has considerado?

fdelucchijr commented 1 year ago

Esta opcion estaria muy buena!

JorgeDuenasLerin commented 1 year ago

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) ...

NoaVelasco commented 1 year ago

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)
jonaypelluz commented 6 months ago

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!