Ir al contenido

¿Cómo convertir HTML a texto en Python?

Aquí hay una publicación de blog de más de 2000 palabras sobre "¿Cómo convertir HTML en texto en Python?":

HTML es un formato importante para almacenar y mostrar datos en la web. Al realizar web scraping, a menudo queremos extraer solo el contenido de texto visible de las páginas HTML. En esta publicación exploraré diferentes técnicas para convertir HTML en texto limpio en Python.

¿Por qué convertir HTML a texto?

Hay algunas razones principales por las que es posible que desees eliminar las etiquetas HTML y extraer solo el texto:

  • Simplifique el contenido extraído – Al raspar páginas web, el HTML generalmente incluye muchas marcas adicionales y elementos que no necesitamos, como enlaces de navegación. Extraer el texto principal hace que el contenido sea más fácil de analizar y trabajar.

  • Quitar formato – HTML aplica formato y diseño visual. Para muchas aplicaciones como el análisis de sentimientos, solo queremos el contenido del texto sin ningún formato.

  • Almacenar en formato de texto – Puede resultar útil extraer solo el texto de HTML para poder almacenarlo en un formato simple como un archivo de texto o en un campo de texto de una base de datos. Esto elimina todo el voluminoso marcado HTML.

  • legibilidad – El HTML sin formato es difícil de leer e interpretar para los humanos. La conversión a texto lo hace más legible.

  • Accesibilidad – El contenido de texto sin formato es más accesible para los lectores de pantalla utilizados por usuarios con discapacidad visual.

  • Indicación en los motores de búsqueda – Los motores de búsqueda analizan e indexan en gran medida el contenido de texto visible de las páginas. Convertir HTML a texto puede ayudar a analizar el contenido de forma similar a cómo lo ven los motores de búsqueda.

En resumen, extraer texto de HTML es útil para el raspado, el análisis, el almacenamiento y la accesibilidad. Las siguientes secciones cubren diferentes formas de lograr esto en Python.

Eliminación de etiquetas HTML con BeautifulSoup

Beautiful Soup es una popular biblioteca de Python para web scraping y análisis de HTML. Podemos usarlo para extraer texto de HTML con bastante facilidad.

El método más simple es llamar al get_text() método en un objeto BeautifulSoup o en un elemento seleccionado del HTML analizado. Por ejemplo:

from bs4 import BeautifulSoup

html = """<p>Here is a paragraph with <a href="http://example.com">a link</a>."""

soup = BeautifulSoup(html, "html.parser")

text = soup.get_text()
print(text)

# Output: Here is a paragraph with a link.

Esto elimina todas las etiquetas HTML y devuelve una cadena que contiene el texto visible.

Una cosa a tener en cuenta es que get_text() De forma predeterminada, también condensará varios espacios en blanco consecutivos en un solo espacio. Aprobar strip=False para preservar espacios en blanco como nuevas líneas y espacios adicionales:

text = soup.get_text(strip=False) 
print(text)

# Output: 
# 
# Here is a paragraph with  
#            a link.

Para extraer texto de sólo una parte del HTML, llame get_text() en un elemento en lugar de todo el documento:

el = soup.select_one("p")
text = el.get_text()
print(text)

# Output: Here is a paragraph with a link.

Una advertencia es que get_text() seguirá incluyendo cualquier texto anidado dentro de elementos secundarios como enlaces. Para eliminarlos también, pase un recursive=False argumento:

text = el.get_text(recursive=False)
print(text) 

# Output: Here is a paragraph with 

Entonces con BeautifulSoup podemos usar fácilmente get_text() para extraer texto visible de HTML.

Extrayendo texto con lxml

lxml es otra biblioteca de Python popular para analizar XML y HTML. También podemos usarlo para extraer texto.

Desde un lxml HTMLParser elemento, llame al text_content() método para obtener el texto:

from lxml.html import fromstring, HTMLParser

html = """<p>Here is a paragraph with <a href="http://example.com">a link</a>.</p>"""

tree = fromstring(html, parser=HTMLParser())

text = tree.text_content() 
print(text)

# Output: Here is a paragraph with a link.

Esto extraerá recursivamente todo el texto, incluidos los elementos secundarios. Para excluir texto de niños, pase un children=False argumento:

text = tree.text_content(children=False)
print(text)

# Output: Here is a paragraph with 

Entonces, lxml también proporciona una forma sencilla de eliminar HTML y obtener solo el contenido del texto.

Expresiones regulares

También se puede utilizar un enfoque basado en expresiones regulares para eliminar etiquetas HTML. Esto implica usar un patrón para hacer coincidir todas las etiquetas HTML y sustituciones para reemplazarlas por nada:

import re

html = """<p>Here is a paragraph with <a href="http://example.com">a link</a>.</p>"""

clean = re.sub(r"<[^>]*>", "", html) 
print(clean)

# Output: Here is a paragraph with a link.

La expresión regular r"<[^>]*>" cerillas < seguido de cualquier cosa excepto > una o más veces, seguido de >. re.sub() call elimina estas coincidencias, eliminando efectivamente todas las etiquetas HTML.

Para tratar también con espacios de nombres XML y etiquetas de cierre automático:

clean = re.sub(r"<[^>]+>", "", html)

Este es un método rápido y sencillo basado en expresiones regulares para eliminar todas las etiquetas HTML. Aunque no ofrece el mismo control y simplicidad que bibliotecas de análisis HTML específicas como BeautifulSoup y lxml.

Manejo de codificación

Las páginas web se pueden codificar en varios formatos de texto como ASCII, UTF-8 o ISO-8859-1. Al extraer páginas, queremos detectar la codificación y decodificarla correctamente en texto Unicode.

La chardet La biblioteca puede detectar automáticamente la codificación por nosotros:

import chardet

html = b"<p>Hello world</p>"

encoding = chardet.detect(html)["encoding"]

if encoding:
    html = html.decode(encoding)
else:
    html = html.decode("utf-8") 

print(html)

Luego podemos decodificar explícitamente los bytes HTML en una cadena Unicode antes de analizar y extraer el texto.

Al convertir HTML a texto, la codificación debe manejarse primero antes de cualquier análisis para evitar errores de codificación.

Ejemplo completo de HTML a texto

A continuación se muestra un ejemplo que reúne los pasos cubiertos para extraer texto de HTML de forma sólida:

from bs4 import BeautifulSoup
import chardet
import re

def html_to_text(html):
    # Detect encoding
    encoding = chardet.detect(html)["encoding"] 

    if encoding:
        html = html.decode(encoding)
    else:
        html = html.decode("utf-8")

    # Remove tags
    clean = re.sub(r"<[^>]+>", "", html)

    # Extract text
    soup = BeautifulSoup(clean, "html.parser")
    text = soup.get_text(strip=True)

    return text

html = """<p>Here is a paragraph with <a href="http://example.com">a link</a>.</p>"""

print(html_to_text(html))

# Output: Here is a paragraph with a link.

Esto maneja la detección de codificación, la eliminación de etiquetas y la extracción de texto en una función reutilizable.

También hay bibliotecas de Python como texturizar que encapsulan parte de esta funcionalidad para convertir varios formatos de archivos a texto.

Convertir entidades HTML

Otro problema con el que podemos encontrarnos es el uso de entidades de caracteres en HTML como   y & en lugar de caracteres literales.

Podemos usar el html.unescape() función del estándar de Python biblioteca html para convertir entidades nuevamente en caracteres:

import html

text = " Bread & Butter"

print(html.unescape(text))

# Output: Bread & Butter 

Esto se puede hacer antes o después de extraer texto de HTML.

Manejo de JavaScript

Una limitación de las técnicas anteriores es que sólo extraen texto visible del HTML inicial. No se capturará ningún texto agregado dinámicamente mediante JavaScript.

Para ejecutar JavaScript y representar texto completo, necesitamos usar un navegador sin cabeza como Selenio or Dramaturgo:

from playwright.sync_api import sync_playwright

html = """<p>Hello</p><script>document.body.innerHTML += "<p>World</p>";</script>"""

with sync_playwright() as p:
    browser = p.webkit.launch()
    page = browser.new_page()
    page.content = html
    text = page.content()
    browser.close()

print(text)    
# Output: <p>Hello</p><p>World</p>

Aquí se utiliza Playwright para cargar la página y ejecutar JavaScript, permitiéndonos extraer el texto completo.

Entonces, para páginas con mucha manipulación de JS, es posible que se necesite una herramienta de automatización del navegador si necesitamos el texto completo renderizado.

Resumen

Existen algunas técnicas principales para convertir HTML a texto sin formato en Python:

  • Uso get_text() de BeautifulSoup
  • Extraer contenido con text_content() en lxml
  • Eliminar etiquetas usando expresiones regulares
  • Decodifica cualquier codificación antes de analizarla.
  • Manejar entidades HTML con html.unescape()
  • Utilice un navegador sin cabeza si es necesario ejecutar JavaScript

Convertir HTML a texto es útil para simplificar el contenido extraído, analizar texto en lugar de marcas, mejorar la legibilidad y accesibilidad, indexar mediante motores de búsqueda y almacenar en un formato liviano.

Espero que esta publicación haya proporcionado una guía completa sobre las principales formas de extraer texto de HTML usando Python. Déjame saber si tienes alguna otra técnica útil.

Únase a la conversación

Su dirección de correo electrónico no será publicada. Las areas obligatorias están marcadas como requeridas *