Volver al blog

resiliparse Web Scraping: Extracción rápida de HTML a texto

Emily Chen
Emily Chen

Advanced Data Extraction Specialist

23-Jul-2026

TL;DR:

  • resiliparse convierte HTML en texto limpio rápidamente, utilizando un núcleo de extracción en C++ diseñado para procesar archivos web a escala de mil millones de páginas.
  • main_content=True elimina el contenido innecesario. Devuelve el texto del artículo sin la navegación, inicio de sesión y pie de página que un volcado de texto ingenuo conserva.
  • Lo que resiliparse no hace es obtener. No tiene cliente HTTP y no ejecuta JavaScript; entrégale marcado y extrae.
  • La diferencia se muestra en un script. Una simple solicitud GET en una página de demostración renderizada por JavaScript produce 23 caracteres de texto; la misma URL obtenida a través de la API de Raspado Universal Scrapeless con js_render devuelve el contenido real.
  • La extracción es real en esta guía. Una ejecución en vivo redujo 10,968 caracteres de HTML renderizado a 1,469 caracteres de texto limpio del contenido principal.
  • Gratis para comenzar en el lado de la obtención. Crea tu clave de API Scrapeless en app.scrapeless.com.

Qué es resiliparse y qué no es

resiliparse es la mitad de análisis y extracción de las herramientas de ChatNoir Resiliparse, construidas por el grupo de investigación del Archivo Web para procesar el Common Crawl y corpora similares. Su extracción de HTML a texto se ejecuta en un núcleo en C++, razón por la cual se mantiene rápida cuando la entrada son millones de documentos en lugar de uno. La función que más usas es extract_plain_text, y su modo main_content=True es la parte útil: elimina la navegación, barras laterales y pies de página que hacen que un volcado de texto en bruto sea ruidoso, dejando el contenido que un lector realmente vino a buscar.

Es una biblioteca de extracción, no un raspador. resiliparse no tiene cliente HTTP, no mantiene sesiones y no ejecuta JavaScript. Dale una cadena o bytes y devuelve texto; pídele que obtenga una URL y no hay método para eso. Así que cada configuración de "raspado web resiliparse" es de dos capas: algo que devuelve HTML fiel y resiliparse que extrae de él. Esta guía utiliza la API de Raspado Universal Scrapeless para la primera capa, porque un cliente HTTP simple devuelve el marcado pre-renderizado en cualquier página que construya su contenido con JavaScript, y el marcado vacío se extrae como texto vacío. Para campos estructurados en lugar de texto legible, el tutorial de raspado web en Python cubre la ruta basada en selectores.

Instalar

resiliparse y requests son toda la cadena de herramientas. La versión contra la que se escribió esta guía es resiliparse 1.0.9:

bash Copy
pip install "resiliparse==1.0.9" requests

Mantén tu clave en el entorno, nunca en el código fuente:

bash Copy
export SCRAPELESS_API_KEY="sk_your_scrapeless_key"

Obtener HTML que vale la pena extraer

La calidad de la extracción está limitada por la fidelidad de la obtención, así que comienza allí. En una página renderizada por JavaScript, el marcado que recibe un cliente HTTP simple no tiene ninguno de los contenidos; solo llega después de que los scripts construyen el DOM, un ciclo de vida definido por la especificación de scripting de HTML. Un script muestra lo que resiliparse obtiene de cada uno:

python Copy
# fidelity.py — lo que resiliparse extrae: GET simple vs renderizado del servidor
import os

import requests
from resiliparse.extract.html2text import extract_plain_text

URL = "https://quotes.toscrape.com/js/"
MARKER = "El mundo tal como lo hemos creado"

plain = requests.get(URL, timeout=60).text
plain_text = extract_plain_text(plain, main_content=True)
print("caracteres de texto plano:", len(plain_text), "| tiene cita:", MARKER in plain_text)

resp = requests.post(
    "https://api.scrapeless.com/api/v2/unlocker/request",
    headers={"Content-Type": "application/json", "x-api-token": os.environ["SCRAPELESS_API_KEY"]},
    json={"actor": "unlocker.webunlocker", "input": {"url": URL, "js_render": True}},
    timeout=120,
)
resp.raise_for_status()
rendered_text = extract_plain_text(resp.json().get("data", ""), main_content=True)
print("caracteres de texto renderizado:", len(rendered_text), "| tiene cita:", MARKER in rendered_text)

La obtención simple extrae casi nada; la renderizada lleva el contenido real:

text Copy
caracteres de texto plano: 23 | tiene cita: False
caracteres de texto renderizado: 1435 | tiene cita: True

Renderizar, desbloquear y enrutar a través de un proxy ocurre todo del lado del servidor en esa única solicitud POST: la API de Raspado Universal es la capa de obtención, y los bytes renderizados son de los que resiliparse debería extraer.

Extraer texto limpio

Con HTML real en mano, resiliparse hace la extracción. Ejecútalo una vez con los valores predeterminados y otra vez con main_content=True para ver cómo se elimina el contenido innecesario:

python Copy
# extract.py — extracción de texto completo vs contenido principal
import os

import requests

from resiliparse.extract.html2text import extract_plain_text

resp = requests.post(
"https://api.scrapeless.com/api/v2/unlocker/request",
headers={"Content-Type": "application/json", "x-api-token": os.environ["SCRAPELESS_API_KEY"]},
json={"actor": "unlocker.webunlocker", "input": {"url": "https://quotes.toscrape.com/", "js_render": True}},
timeout=120,
)
resp.raise_for_status()
html = resp.json().get("data", "")

full = extract_plain_text(html)
main = extract_plain_text(html, main_content=True)
print("caracteres de html renderizado:", len(html))
print("caracteres de texto completo:", len(full))
print("caracteres de contenido principal:", len(main))
print("tiene la primera cita:", "El mundo tal como lo hemos creado" en main)

La ejecución convierte 10,968 caracteres de HTML en texto legible, y main_content recorta aún más el exceso:

text Copy
caracteres de html renderizado: 10968
caracteres de texto completo: 1674
caracteres de contenido principal: 1469
tiene la primera cita: True

Ese es todo el flujo: un POST para obtener y renderizar, una llamada para extraer. main_content=True es lo que hace que la salida alimente un modelo de lenguaje o un índice de búsqueda de manera limpia: la navegación y los avisos de inicio de sesión que sobreviven a un volcado de texto completo han desaparecido, y el texto de la cita permanece.

Obtenga su clave API en el plan gratuito: app.scrapeless.com

Patrones avanzados

  • Pasar bytes, no una cadena decodificada, cuando la codificación es incierta. resiliparse detecta la codificación del documento; pasarle los bytes de respuesta crudos evita una doble decodificación que distorsiona el texto no ASCII.
  • Utilice las banderas alt_texts y links para conservar o eliminar detalles. extract_plain_text acepta banderas que preservan el texto alternativo de las imágenes o los objetivos de los enlaces cuando los necesita y los omite cuando no.
  • Opta por resiliparse.parse.html cuando necesites el árbol. La herramienta también expone una API de árbol HTML y selectores, por lo que puedes extraer campos estructurados del mismo núcleo rápido cuando el texto plano no es suficiente.
  • Mantenga los pasos de obtención y extracción separados. La extracción es intensiva en CPU y la obtención es intensiva en IO; obtenga las páginas primero, luego ejecute la extracción sobre el lote, para que ninguno espere al otro.

Solución de problemas

  • Casi ningún texto de una página que puedes ver en un navegador. El contenido está renderizado por JavaScript y tu obtención devolvió el HTML prerenderizado. El resultado de 23 caracteres del primer script es exactamente este caso; corrígelo en la capa de obtención con js_render.
  • Texto de navegación y pie de página en la salida. Llamaste a extract_plain_text sin main_content=True. Actívalo para eliminar el texto innecesario.
  • Caracteres acentuados entrelazados. Pasaste a resiliparse una cadena mal decodificada. Pasa los bytes de respuesta y permite que detecte la codificación.
  • El contenido que querías quedó recortado. main_content es agresivo por diseño. Para páginas con una estructura inusual, compáralo con la salida de texto completo y regresa a ella cuando la extracción de contenido principal elimine demasiado.

Conclusión

resiliparse se gana su lugar como la capa de extracción que escala: un núcleo en C++ que convierte HTML en texto limpio rápidamente, con un modo main_content que elimina el exceso. La capa que decide si alguna de eso es posible es la obtención: la división de 23 caracteres frente a 1,435 caracteres del primer script lo resuelve, y un POST renderizado por el servidor cierra la brecha. Conecta los dos y una página renderizada se convierte en texto limpio, listo para un índice o un modelo.

Crea una cuenta gratuita en Scrapeless para obtener una clave API, y la documentación del desarrollador cubre los parámetros de unlocker.webunlocker. Consulta precios de Scrapeless cuando planees un trabajo recurrente.

FAQ

P: ¿Puede resiliparse raspar sitios web por sí mismo?

No. resiliparse extrae texto del HTML que ya tienes; no tiene cliente HTTP y no ejecuta JavaScript. Combínalo con una capa de obtención: aquí la API de Scraping Universal de Scrapeless, que renderiza la página del lado del servidor, y resiliparse maneja la extracción de texto de los bytes devueltos.

P: ¿En qué se diferencia resiliparse de un removedor de texto innecesario como trafilatura?

Ambos eliminan texto innecesario, pero resiliparse proviene del grupo de investigación del Archivo Web y está construido en C++ para un rendimiento a gran escala, y se envía como parte de un conjunto de herramientas más amplio que también lee archivos WARC y detecta codificación y lenguaje. Opta por él cuando la velocidad a través de muchos documentos sea la limitación.

P: ¿Qué hace realmente main_content=True?
Realiza un pase de extracción de contenido que conserva el texto principal del artículo y elimina la navegación, las barras laterales, los encabezados y los pies de página. La comparación en esta guía muestra la salida recortada en comparación con la salida de texto completo para que puedas ver qué se elimina.

P: ¿Resiliparse maneja páginas renderizadas por JavaScript?

No por sí solo; nunca ejecuta scripts. Si el contenido se carga después del HTML inicial, una simple extracción resulta en casi nada, como muestra el resultado de 23 caracteres. Obtén la página a través de la API de Scrapeless con js_render primero, y luego extrae.

P: ¿Es legal hacer scraping con resiliparse?

La biblioteca de extracción no cambia las reglas de colección. Solo extrae páginas públicas, respeta los términos del sitio y las directivas de robots estandarizadas por el Protocolo de Exclusión de Robots, mantiene los volúmenes limitados y maneja cualquier dato personal según las leyes que apliquen a ti.

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