Verificar ortografía de una página web



Versión: 3.x.
Descarga: urlsc.zip.

El siguiente código permite chequear la ortografía de una página web dada una URL. El programa lee el contenido de la dirección solicitada utilizando la función estándar urllib.request.urlopen, extrae el texto con Beautiful Soup 4 y verifica cada una de las palabras vía Hunspell.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#       Copyright 2016 Recursos Python - www.recursospython.com
#
#

from string import ascii_lowercase
from urllib.request import urlopen

from bs4 import BeautifulSoup
from hunspell import HunSpell


def chars_filter(s, valid_chars):
    return "".join(c for c in s if c in valid_chars)


def main():
    url = "http://recursospython.com/guias-y-manuales/por-que-existe-python-3/"
    
    # Obtener contenido de la página.
    with urlopen(url) as r:
        content = r.read()
    
    # Analizar el código HTML.
    soup = BeautifulSoup(content, "html.parser")
    # Etiqueta HTML de donde extraer el texto.
    root = soup.article
    
    # Remover código innecesario.
    for tag in root.find_all(["script", "style", "code", "pre"]):
        tag.decompose()
    
    # Extraer texto, remover saltos de línea y convertir 
    # a minúsculas para agilizar la búsqueda.
    text = root.get_text().replace("\n", " ").lower()
    # Remover caracteres innecesario (puntuación y demás).
    text = chars_filter(text, ascii_lowercase + "áéíóúñü ")
    
    # Crear el diccionario y agregar las palabras necesarias.
    dic = HunSpell("es_ANY.dic", "es_ANY.aff")
    dic.add("python")
    
    unknown_words = {}
    
    # Buscar palabras que no se encuentren en el diccionario.
    for word in text.split(" "):
        if word:
            # Ignorar letras sueltas.
            if len(word) > 1 and not dic.spell(word):
                if word in unknown_words:
                    unknown_words[word] += 1
                else:
                    unknown_words[word] = 1
    
    print(len(unknown_words), "palabras desconocidas.")
    
    # Ordenar alfabéticamente e imprimir sugerencias.
    for word in sorted(unknown_words):
        print("{} ({}).".format(word, unknown_words[word]))
        suggest = dic.suggest(word)
        if suggest:
            print("¿Quiso decir {}?".format(
                ", ".join(s.decode("utf-8") for s in suggest)))


if __name__ == "__main__":
    main()

Con la URL por defecto del artículo Por qué existe Python 3 el script imprime las siguientes sugerencias.

18 palabras desconocidas.
agradecidamente (1).
¿Quiso decir agradecida mente, agradecida-mente, desgraciadamente, agradecimiento, enternecidamente, encarecidamente?
ascii (1).
¿Quiso decir ascitis?
brett (1).
¿Quiso decir brete, Bretó?
bug (1).
¿Quiso decir bu, bus, bum, Buga?
by (1).
¿Quiso decir bu, y, bey, ay, be, bs, bv?
cannon (1).
¿Quiso decir canon, can non, can-non, cantonan, canoa, cano?
exists (1).
¿Quiso decir exista, existas, existes, existís, existe, existo, existí, existir?
pep (3).
¿Quiso decir peo, pe, pp, pepa, pepe, pea, pee, rep, pop, pes, pez, peí, peé?
poisición (1).
¿Quiso decir posición, inquisición?
puget (1).
¿Quiso decir puñete?
puppy (1).
¿Quiso decir Pupuya?
renumeramos (1).
¿Quiso decir remuneramos, enumeramos, re numeramos, re-numeramos, numeramos, enumeraros, enumeraos, enumerativos?
semánticamente (1).
¿Quiso decir semántica mente, semántica-mente, sistemáticamente, matemáticamente, esquemáticamente, cuánticamente?
solucionables (1).
¿Quiso decir solucionales, solucionarles, solucionadles, soluciona bles, soluciona-bles, solucionares, solucionas, soluciones, revolucionales?
sound (1).
¿Quiso decir undoso?
string (1).
¿Quiso decir astringir?
unicode (8).
¿Quiso decir unicornio?
why (1).
¿Quiso decir whisky?

La función get_text de Beautiful Soup no es del todo precisa, por lo que puede retornar textos pertenecientes a comentarios HTML, código JavaScript o CSS, entre otros datos no deseados. Por esta razón es propicio indicar, siempre que sea posible, el bloque de código HTML en donde se encuentra el texto.

    # Etiqueta HTML de donde extraer el texto.
    root = soup.article

Otros ejemplos:

    # Extraer el texto de todo el documento HTML.
    root = soup

    # Más específico.
    root = soup.body.div

Además, probablemente querrás excluir algunas etiquetas de la búsqueda de texto.

    # Remover código innecesario.
    for tag in root.find_all(["script", "style", "code", "pre"]):
        tag.decompose()

En general, el código JavaScript y CSS (<script> y <style>). En el caso particular de Recursos Python, añado <code> y <pre> para excluir el código Python que incluyen la mayoría de los artículos.



Deja un comentario