extract_ text
Extraiga texto limpio y legible de HTML con análisis inteligente. Elimina automáticamente scripts, estilos y contenido repetitivo mientras conserva el contenido de texto principal.
Casos de uso
Extracción de artículos para LLMs
Extraiga texto limpio de artículos para resumir, analizar o procesar con IA
Análisis de contenido
Obtenga texto plano para conteo de palabras, análisis de legibilidad o detección de sentimiento
Texto limpio para resúmenes
Elimine el ruido HTML antes de pasarlo a los modelos de resumen
Eliminación de contenido repetitivo
Elimine anuncios, navegación y otros elementos que no son contenido
Endpoint
/api/v1/tools/extract_textParameters
Nota: Debe proporcionar html o url. Si proporciona ambos, html tiene prioridad.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
html | string | Optional | - | Contenido HTML del que extraer texto (proporcione html o url) Example: <html><body><h1>Hello World</h1></body></html> |
url | string | Optional | - | URL para obtener y extraer texto (proporcione html o url) Example: https://example.com/article |
selector | string | Optional | - | Selector CSS para apuntar a elementos específicos (predeterminado: toda la página) Example: article, .content, #main |
clean | boolean | Optional | true | Reduce los espacios repetidos dentro de cada línea y elimina las líneas en blanco; se conservan los saltos de línea entre bloques. Solo se aplica con `output_format: "text"`. Example: true |
preserve_links | boolean | Optional | false | Añade cada enlace como una línea `text (href)` después del texto extraído. Solo en la API REST —la herramienta MCP no tiene esta opción— y solo se aplica con `output_format: "text"`. Example: false |
preserve_formatting | boolean | Optional | false | Conserva los saltos de párrafo y de encabezado del HTML de origen. Solo en la API REST —la herramienta MCP no tiene esta opción— y solo se aplica con `output_format: "text"`. Example: false |
max_length | number | Optional | - | Longitud máxima del texto o markdown devuelto. Un resultado más largo se corta y termina en `...`, y `data.truncated` es `true`; `data.truncated` siempre está presente y vale `false` cuando no se cortó nada. Example: 5000 |
output_format | string | Optional | text | `"text"` (predeterminado) devuelve `data.text`, una línea por elemento de bloque: `<h1>Hi</h1><p>there</p>` se lee `Hi\nthere`. `"markdown"` devuelve `data.markdown` en su lugar: los elementos seleccionados (o el body) convertidos a Markdown con Turndown. En ambos casos `data` incluye `output_format`, `word_count` y `char_count`, con los mismos nombres que usa la herramienta MCP; un resultado markdown se cuenta sin sus caracteres de sintaxis Markdown (`#`, `*`, `_`, `[`, `]` y comillas invertidas). `clean`, `preserve_links` y `preserve_formatting` solo se aplican al texto; `max_length` se aplica a ambos. Example: markdown |
respect_robots | boolean | Optional | true | Respeta el robots.txt del sitio de destino. Con el valor `true`, una ruta que robots.txt no permita a `CrawlForge` se rechaza con un 403 antes de descargar nada y no se cobran credits. Póngalo en `false` solo para destinos con los que tenga su propio acuerdo: la respuesta incluye entonces una entrada `warnings` y la anulación queda registrada en su API key. Example: true |
escalate | boolean | Optional | false | Activa un único reintento automático a través del navegador stealth cuando la descarga simple de `url` encuentra un muro en lugar de la página: una página de desafío de Cloudflare, Amazon, DataDome, PerimeterX, Akamai o Vercel, un 403, 429 o 444 sin más, o un armazón vacío o una página de error servidos con un 2xx. La descarga simple siempre se ejecuta primero; un 404, un 5xx, un binario como un PDF o un host cuya ventana de `Retry-After` sigue abierta nunca escalan, y la entrada `html` nunca se descarga. El texto se extrae del HTML renderizado, de modo que la respuesta tiene la misma forma, más `escalated` (siempre que se indique este parámetro) y `stealth: { engine, vendor_detected }` cuando el renderizado se ejecutó. La escalada reutiliza la misma ruta stealth que [stealth_mode](/docs/api-reference/tools/stealth-mode) y la misma comprobación de robots.txt, y no añade ningún tratamiento nuevo de una defensa antibots; un muro en el que también se rechaza el renderizado sigue devolviéndose como página bloqueada con `escalated: true`, sin coste. Añade 5 credits, cobrados solo cuando el renderizado se ejecuta de verdad. Example: true |
escalate_engine | string | Optional | playwright | Motor de navegador para la etapa de escalada: "playwright" (por defecto) o "camoufox" (basado en Firefox, con mayor resistencia a la detección; disponible solo donde esté instalado en el backend). Se ignora salvo que `escalate` sea `true` y la descarga simple haya quedado bloqueada. Example: camoufox |
redact_pii | boolean | object | Optional | false | Elimine los datos personales del texto que devuelve esta llamada, antes de que el resultado se almacene o se envíe de vuelta. `true` es la forma abreviada de `{ mode: "fast" }`: las cuatro clases de expresiones regulares, etiquetadas. Siempre que pida redacción, la respuesta lleva `redaction: { entities, count, mode }` dentro de `data`, incluso cuando no hubo coincidencias (`count: 0`), de modo que «no se encontró nada» nunca se confunde con «se ignoró el parámetro»; una clase sin coincidencias se omite en lugar de informarse como `0`. La redacción se ejecuta **antes** de almacenar el resultado, así que un resultado grande que se lea después con [read_result](/docs/api-reference/tools/read-result) ya viene redactado. Dos límites deliberados: las direcciones (`url`, `link`, `href`, `canonical_url`) nunca se redactan, y los contadores derivados del texto (`content_length`, `word_count`, `character_count`) lo describen tal como se extrajo, antes de la redacción. Example: true |
Descarga de una URL
- La página se descarga una vez con un tiempo de espera de 15 segundos. Un 429 o 503 cuyo
Retry-Aftersea de 10 segundos o menos se espera y se vuelve a descargar una vez; unRetry-Aftermás largo o ausente no se reintenta. - Se leen HTML, XHTML, XML y cualquier tipo
text/*, y una respuesta sinContent-Typese lee como HTML. Un PDF, una imagen u otro binario devuelve415 UNSUPPORTED_CONTENT_TYPEconnext_step: "process_document"y no cobra nada: léelo con process_document. - Un cuerpo JSON (
application/jsono*+json) se devuelve tal cual entext, con el avisothe target returned application/json; its body is returned as text. Conoutput_format: "markdown"se devuelve enmarkdown. - Una página que se renderiza en el cliente —menos de 200 caracteres de texto visible y un
<div id="root">,"app"o"__next"vacío, o un texto que dice que la página necesita JavaScript ("Enable JavaScript…")— se devuelve con éxito, conrendered: falseendatay el avisopage renders client-side; use scrapeenwarningscuando no se ejecutó ningún renderizado stealth, para que un armazón vacío no se confunda con una página corta. La entradahtmlse comprueba igual.
Ejemplos de solicitud
cURL - Extraer desde URL
curl -X POST https://www.crawlforge.dev/api/v1/tools/extract_text \
-H "X-API-Key: cf_test_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com/article",
"selector": "article",
"clean": true,
"max_length": 5000
}'TypeScript - Extraer desde HTML
// npm install crawlforge-sdk
import { CrawlForge } from 'crawlforge-sdk';
const client = new CrawlForge({ apiKey: process.env.CRAWLFORGE_API_KEY });
const htmlContent =
'<html><body>' +
'<article>' +
'<h1>Article Title</h1>' +
'<p>This is the main content of the article.</p>' +
'<a href="/related">Related Article</a>' +
'</article>' +
'</body></html>';
const result = await client.extractText({
html: htmlContent,
selector: 'article',
clean: true,
preserve_links: true,
});
// result.data is untyped in crawlforge-sdk 0.1 — its shape is the Response Example below.
const { text, metadata } = result.data as {
text: string; metadata: { word_count: number; character_count: number };
};
console.log('Extracted text:', text);
console.log('Word count:', metadata.word_count);
console.log('Character count:', metadata.character_count);Python - Extraer con selector
# pip install crawlforge
from crawlforge import CrawlForge
client = CrawlForge() # reads CRAWLFORGE_API_KEY
result = client.extract_text(
url='https://example.com/article',
selector='article, .main-content',
clean=True,
preserve_formatting=True,
max_length=10000,
)
# result.data is a plain dict — its shape is the Response Example below.
text = result.data['text']
metadata = result.data['metadata']
print(f"Title: {metadata['title']}")
print(f"Word count: {metadata['word_count']}")
print(f"Character count: {metadata['character_count']}")
print(f"\nExtracted text:\n{text[:500]}...")Ejemplo de respuesta
{ "success": true, "data": { "text": "Article Title\nThis is the main content of the article. It contains useful information that has been extracted from the HTML.\nLinks:\nRelated Article (/related)", "output_format": "text", "word_count": 248, "char_count": 1432, "truncated": false, "metadata": { "title": "Article Title - Example Site", "description": "Meta description of the article", "word_count": 248, "character_count": 1432, "selector_used": "article", "links_preserved": true, "formatting_preserved": false } }, "credits_used": 1, "credits_remaining": 999, "processing_time": 180}data.textEl contenido de texto plano extraídodata.output_format"text" o "markdown"; una llamada markdown devuelve data.markdown en lugar de data.textdata.word_countPalabras del texto devuelto (con el mismo nombre que en la herramienta MCP)data.char_countCaracteres del texto devueltodata.truncatedtrue cuando max_length cortó el texto (entonces termina en ...); siempre presentedata.metadata.word_countNúmero total de palabras en el texto extraídodata.metadata.character_countNúmero total de caracteresdata.metadata.selector_usedEl selector CSS que se aplicócredits_usedCredits descontados por esta solicitud (1 por cada extracción)Manejo de errores
Entrada faltante (400 Bad Request)
No se proporcionó ni html ni url. Debe proporcionar al menos uno.
Selector no válido (400 Bad Request)
El selector CSS no es válido o no coincide con ningún elemento. Verifique la sintaxis de su selector.
Bloqueado por un muro antibots (403, 444 o 502)
El destino respondió con una página de desafío antibots en lugar del contenido, sea cual sea su código HTTP. La respuesta es success: false con error.code BLOCKED, un objeto blocked que nombra el vendor (por ejemplo cloudflare o akamai) y la evidence por la que se reconoció, y un next_step: extract_text with escalate:true, or stealth_mode operation:"scrape". El código es el propio del destino cuando es 403, 404, 410, 429, 444 o 451, y 502 en cualquier otro caso, incluido un muro servido con 200. No se cobra ningún credit. Con escalate: true el muro se renderiza una vez en el navegador stealth; si el renderizado también se rechaza, el mismo error lleva escalated: true y ningún next_step.
El destino respondió con un error (502 Bad Gateway)
El destino respondió con un error HTTP y sin un muro antibots reconocido. error.code es UPSTREAM_HTTP y el mensaje es Target answered HTTP <n>. Un 403, 404, 410, 429, 444 o 451 se devuelve tal cual como código de la respuesta; cualquier otro error (un 5xx, o un 400 o 401 del propio destino) es un 502, para que no se confunda con un problema de su solicitud o de su API key. Un 403, 429 o 444 incluye además next_step. No se cobra ningún credit.
Bloqueado por robots.txt (403 Forbidden)
El robots.txt del sitio de destino no permite esta ruta a CrawlForge. Establezca respect_robots: false para anularlo si tiene su propio acuerdo con el destino: la anulación queda registrada en su API key. La anulación no alcanza a un host incluido en la lista de exclusión permanente de CrawlForge, que se rechaza sea cual sea el valor de respect_robots.
Tipo de contenido no admitido (415 Unsupported Media Type)
El destino sirvió un PDF, una imagen u otro binario. error.code es UNSUPPORTED_CONTENT_TYPE, el mensaje es Unsupported content type <type>: extract_text reads HTML and text y next_step es process_document. El cuerpo no se lee, no se escala nada y no se cobra ningún credit.
Backend de escalada no configurado (503 TOOL_NOT_AVAILABLE)
escalate: true ejecuta su etapa stealth en el backend de ejecución de CrawlForge. Cuando ese backend no está configurado, la etapa devuelve 503 y no se cobra ningún credit.
Costo en credits
escalate: true una llamada se proyecta en hasta 6 credits y solo paga el suplemento de escalada de 5 credits cuando la descarga simple quedó bloqueada y el renderizado stealth se ejecutó; ningún fallo se cobra.Herramientas relacionadas
¿Listo para extraer texto limpio? Regístrese gratis y obtenga 1,000 credits para empezar.