Volver al blog

Trafilatura Web Scraping: Extracción de texto limpio para LLMs

Isabella Garcia
Isabella Garcia

Web Data Collection Specialist

22-Jul-2026

TL;DR:

  • Trafilatura convierte una página HTML en texto limpio de contenido principal, eliminando la navegación, las barras laterales y los pies de página para que un modelo de lenguaje vea el contenido y no el diseño.
  • En la página de ejemplo, 9,275 caracteres de HTML se convierten en 1,324 caracteres de texto limpio, una reducción del 86% que entra directamente en la ventana de contexto de un LLM.
  • Trafilatura no tiene una capa de recuperación que limpie bloqueos, así que esta guía empareja Scrapeless para la recuperación con trafilatura para la extracción.
  • trafilatura.extract produce texto plano, y la misma llamada con output_format="markdown" o "json" da como resultado Markdown o un registro de metadatos con el título, autor y fecha.
  • La separación es clara: Scrapeless obtiene la página, y trafilatura extrae el artículo de ella.
  • Comienza con el plan gratuito de Scrapeless y dirige el extractor a tus propias páginas.

Una página HTML extraída generalmente no es lo que quieres. La navegación, los banners de cookies, las barras de artículos relacionados y los pies de página pueden ser la mayor parte de los bytes, y alimentar todo eso a un modelo de lenguaje desperdicia tokens y diluye la señal. Trafilatura resuelve la segunda mitad de ese problema: dado HTML, encuentra el contenido principal y lo devuelve como texto limpio. No resuelve la primera mitad, porque no puede acceder a una página que lo impide.

Esta guía empareja las dos mitades. La API Universal de Scraping de Scrapeless recupera la página, y trafilatura extrae el artículo. Cada número a continuación proviene de una ejecución real contra una página pública.

Qué Hace Trafilatura

Trafilatura es una biblioteca de extracción de contenido principal: lee HTML y devuelve el texto del artículo sin el entorno circundante. Recorre la estructura de la página para distinguir entre contenido y navegación, y su calidad de extracción se evalúa en el artículo revisado por pares que la introdujo. Para cualquiera que esté construyendo un pipeline de recuperación o LLM, ese es el paso entre "Tengo el HTML" y "Tengo texto que vale la pena incrustar."

Lo que trafilatura no es, es un scraper. No tiene navegador, proxy ni forma de superar un desafío de acceso. Su fetch_url incorporado es un cliente HTTP simple, así que en una página protegida obtiene una página de bloqueo y dutifully extrae el bloque. Esa es la razón por la cual la recuperación pertenece a una herramienta construida para ello.

Instalación

Trafilatura se instala con un solo comando pip.

bash Copy
pip install trafilatura

Establece tu clave de Scrapeless en el terminal. Usa la clave real en el tiempo de ejecución y mantén el marcador fuera de tu código fuente.

bash Copy
export SCRAPELESS_API_KEY="sk_tu_clave_aqui"

Extracción Básica

Recupera la página con Scrapeless, luego entrega el HTML a trafilatura.extract. Devuelve el contenido principal como texto limpio.

python Copy
import json
import os
import urllib.request

import trafilatura

API_URL = "https://api.scrapeless.com/api/v2/unlocker/request"
TARGET = "https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html"


def fetch_html(url: str) -> str:
    payload = json.dumps(
        {"actor": "unlocker.webunlocker", "input": {"url": url, "js_render": False, "headless": False}}
    ).encode()
    request = urllib.request.Request(
        API_URL,
        data=payload,
        headers={"x-api-token": os.environ["SCRAPELESS_API_KEY"], "Content-Type": "application/json"},
        method="POST",
    )
    with urllib.request.urlopen(request, timeout=90) as response:
        return json.loads(response.read())["data"]


html = fetch_html(TARGET)
text = trafilatura.extract(html)
print(f"caracteres html crudos: {len(html)}")
print(f"caracteres texto limpio: {len(text)}")
print(f"boilerplate removido: {100 * (1 - len(text) / len(html)):.0f}%")

La salida muestra cuánto se reduce la página una vez que el diseño ha desaparecido.

text Copy
caracteres html crudos: 9275
caracteres texto limpio: 1324
boilerplate removido: 86%

Los 1,324 caracteres que quedan son el título, el precio, la disponibilidad y la descripción del producto; la navegación, las migas de pan y el pie de página han desaparecido. Esa reducción del 86% son tokens que ya no pagas a un modelo para leer.

Markdown y Metadatos

El texto plano es el formato predeterminado, pero un pipeline de recuperación generalmente quiere estructura. La misma llamada a extract toma un output_format, así que Markdown mantiene los encabezados y listas que un modelo lee bien.

python Copy
markdown = trafilatura.extract(html, output_format="markdown")
print(f"caracteres markdown: {len(markdown)}")

Para la procedencia, solicita JSON con metadatos. El registro lleva el título, autor, nombre de host, fecha y lenguaje junto al texto, que es lo que almacenas junto a una incrustación para que un fragmento recuperado pueda citar su fuente.

python Copy
record = json.loads(trafilatura.extract(html, output_format="json", with_metadata=True))
print(f"título: {record['title']}")

El Extractor Completo

Ponga el fetch, el texto, el Markdown y los metadatos juntos, y un script toma una URL para todo lo que una canalización posterior necesita.

python Copy
import json
import os
import urllib.request

import trafilatura

API_URL = "https://api.scrapeless.com/api/v2/unlocker/request"
TARGET = "https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html"


def fetch_html(url: str) -> str:
    payload = json.dumps(
        {"actor": "unlocker.webunlocker", "input": {"url": url, "js_render": False, "headless": False}}
    ).encode()
    request = urllib.request.Request(
        API_URL,
        data=payload,
        headers={"x-api-token": os.environ["SCRAPELESS_API_KEY"], "Content-Type": "application/json"},
        method="POST",
    )
    with urllib.request.urlopen(request, timeout=90) as response:
        return json.loads(response.read())["data"]


html = fetch_html(TARGET)
print(f"caracteres html sin procesar: {len(html)}")

text = trafilatura.extract(html)
print(f"caracteres de texto limpio: {len(text)}")
print(f"boilerplate eliminado: {100 * (1 - len(text) / len(html)):.0f}%")

markdown = trafilatura.extract(html, output_format="markdown")
print(f"caracteres markdown: {len(markdown)}")

record = json.loads(trafilatura.extract(html, output_format="json", with_metadata=True))
print(f"título: {record['title']}")

La ejecución informa cada salida que consume la canalización.

text Copy
caracteres html sin procesar: 9275
caracteres de texto limpio: 1324
boilerplate eliminado: 86%
caracteres markdown: 1474
título: A Light in the Attic

Donde Trafilatura se Detiene

Trafilatura extrae; no recupera más allá de un bloque, y ese límite es la razón por la que esta guía usa dos herramientas. Dirija el fetch de trafilatura a una página protegida y recibirá un desafío o una estructura vacía, y luego no extrae nada útil de ella. Scrapeless maneja la recuperación, devolviendo el HTML renderizado, y trafilatura toma el control a partir de ahí. Cuando un objetivo renderiza su artículo con JavaScript, establezca js_render en True en la solicitud para que el HTML que trafilatura recibe ya contenga el contenido; déjelo en False, como aquí, cuando el marcado es generado por el servidor.

Antes de ejecutar esto en un sitio, lea su robots.txt y términos. El Protocolo de Exclusión de Robots establece qué caminos un sitio pide a los clientes automatizados que eviten, y respetarlo mantiene una canalización de extracción sostenible. Para una visión más amplia de la ingestión, la guía sobre cómo construir un pipeline de texto web limpio para RAG muestra dónde encaja este paso de extracción.

¿Listo para probarlo en tus propias páginas? Crea una cuenta gratuita en Scrapeless y cambia la URL de destino.

Conclusión

El texto limpio es lo que un modelo de lenguaje realmente necesita, y llegar allí requiere dos pasos: recuperar y luego extraer. Scrapeless devuelve la página, y trafilatura convierte 9,275 caracteres de HTML en 1,324 caracteres de contenido, en texto, Markdown o un registro de metadatos. La documentación de trafilatura cubre los formatos de salida y opciones de ajuste en su totalidad. Comience desde el script completo, intercambie su propia URL y alimente el resultado a su paso de incrustación o LLM.

Comience con el plan gratuito de Scrapeless para recuperar sus propias páginas, y consulte los precios de Scrapeless cuando dimensione un trabajo recurrente.

FAQ

P: ¿Trafilatura obtiene páginas web por sí misma?

Tiene un fetch_url incorporado, pero ese es un cliente HTTP simple sin desbloqueo, por lo que falla en páginas detrás de un desafío de acceso. Combínelo con una herramienta de recuperación como Scrapeless que devuelve HTML renderizado, y deje que trafilatura haga lo que mejor sabe hacer, que es extraer el contenido principal de ese HTML.

P: ¿Cómo difiere trafilatura de BeautifulSoup?

BeautifulSoup es un analizador: le dice qué elementos seleccionar. Trafilatura es un extractor: decide qué parte de la página es el contenido principal y lo devuelve, sin selectores que escribir. Use BeautifulSoup cuando necesite campos específicos, y trafilatura cuando desee el cuerpo del artículo como texto limpio.

P: ¿Qué formatos de salida admite trafilatura?

La función extract toma un output_format de txt (el predeterminado), markdown, json o xml. Markdown mantiene encabezados y listas para la entrada de LLM, y JSON con with_metadata=True agrega el título, autor, fecha e idioma junto al texto.

P: ¿Puede trafilatura mantener el título y el autor?
Sí. Llama a extract con output_format="json" y with_metadata=True, y el registro devuelto incluye title, author, hostname, date y language. Almacenar esos metadatos junto con una incrustación permite que un fragmento recuperado informe de dónde proviene.

P: ¿Por qué extraer el contenido principal en lugar de enviar la página completa a un LLM?

La mayor parte de una página es navegación, anuncios y pies de página, que en la página de ejemplo constituyen el 86% de los caracteres. Enviar todo esto cuesta tokens y entierra la señal, por lo que extraer primero el contenido principal reduce costos y mejora el enfoque del modelo en el texto que importa.

En Scrapeless, solo accedemos a datos disponibles públicamente y cumplimos estrictamente con las leyes, regulaciones y políticas de privacidad del sitio web aplicables. El contenido de este blog es sólo para fines de demostración y no implica ninguna actividad ilegal o infractora. No ofrecemos garantías y renunciamos a toda responsabilidad por el uso de la información de este blog o enlaces de terceros. Antes de realizar cualquier actividad de scraping, consulte a su asesor legal y revise los términos de servicio del sitio web de destino u obtenga los permisos necesarios.

Artículos más populares

Catalogar