Langkau ke kandungan
Alat Asas1 credit

extract_text

Ekstrak teks bersih dan mudah dibaca daripada HTML dengan penghuraian pintar. Membuang skrip, gaya dan kandungan boilerplate secara automatik sambil mengekalkan kandungan teks utama.

Kes Penggunaan

Pengekstrakan Artikel untuk LLM

Ekstrak teks artikel yang bersih untuk peringkasan, analisis atau pemprosesan AI

Analisis Kandungan

Dapatkan teks biasa untuk kiraan perkataan, analisis kebolehbacaan atau pengesanan sentimen

Teks Bersih untuk Peringkasan

Buang gangguan HTML sebelum dihantar ke model peringkasan

Pembuangan Boilerplate

Buang iklan, navigasi dan elemen bukan kandungan yang lain

Endpoint

POST/api/v1/tools/extract_text
Auth Required
1 req/s pada pelan Free
1 credit

Parameters

NameTypeRequiredDefaultDescription
html
stringOptional-
Kandungan HTML untuk mengekstrak teks (sediakan sama ada html atau url)
Example: <html><body><h1>Hello World</h1></body></html>
url
stringOptional-
URL untuk diambil dan diekstrak teksnya (sediakan sama ada html atau url)
Example: https://example.com/article
selector
stringOptional-
Pemilih CSS untuk menyasarkan elemen tertentu (lalai: keseluruhan halaman)
Example: article, .content, #main
clean
booleanOptionaltrue
Mampatkan ruang berulang dalam satu baris dan buang baris kosong; pemisah baris antara blok dikekalkan. Hanya terpakai untuk `output_format: "text"`.
Example: true
preserve_links
booleanOptionalfalse
Tambah setiap pautan sebagai baris `text (href)` selepas teks yang diekstrak. API REST sahaja — alat MCP tiada pilihan ini — dan hanya terpakai untuk `output_format: "text"`.
Example: false
preserve_formatting
booleanOptionalfalse
Kekalkan pemisah perenggan dan tajuk daripada sumber HTML. API REST sahaja — alat MCP tiada pilihan ini — dan hanya terpakai untuk `output_format: "text"`.
Example: false
max_length
numberOptional-
Panjang maksimum teks atau markdown yang dikembalikan. Hasil yang lebih panjang dipotong dan berakhir dengan `...`, dan `data.truncated` ialah `true`; `data.truncated` sentiasa ada, `false` apabila tiada apa-apa yang dipotong.
Example: 5000
output_format
stringOptionaltext
`"text"` (lalai) mengembalikan `data.text`, satu baris bagi setiap elemen blok — `<h1>Hi</h1><p>there</p>` dibaca `Hi\nthere`. `"markdown"` mengembalikan `data.markdown` sebaliknya: elemen yang dipilih (atau body) ditukar kepada Markdown dengan Turndown. Dalam kedua-dua mod, `data` membawa `output_format`, `word_count` dan `char_count`, dengan nama yang sama seperti alat MCP; hasil markdown dikira tanpa aksara sintaks Markdown (`#`, `*`, `_`, `[`, `]` dan tanda backtick). `clean`, `preserve_links` dan `preserve_formatting` hanya terpakai untuk teks; `max_length` terpakai untuk kedua-duanya.
Example: markdown
respect_robots
booleanOptionaltrue
Hormati robots.txt tapak sasaran. Dibiarkan pada `true`, laluan yang dilarang untuk `CrawlForge` ditolak dengan 403 sebelum apa-apa diambil dan tiada credits dicaj. Tetapkan kepada `false` hanya untuk sasaran yang anda mempunyai perjanjian sendiri dengannya — respons kemudiannya membawa entri `warnings` dan tindakan mengatasi itu direkodkan pada API key anda.
Example: true
escalate
booleanOptionalfalse
Pilih untuk menyertai satu percubaan semula automatik melalui pelayar stealth apabila ambilan biasa `url` menemui dinding dan bukan halaman — halaman cabaran Cloudflare, Amazon, DataDome, PerimeterX, Akamai atau Vercel, 403, 429 atau 444 semata-mata, atau cengkerang kosong atau halaman ralat yang dihantar dengan 2xx. Ambilan biasa sentiasa berjalan dahulu; 404, 5xx, fail binari seperti PDF, atau hos yang tetingkap `Retry-After`-nya masih terbuka tidak pernah ditingkatkan, dan input `html` tidak pernah diambil. Teks diekstrak daripada HTML yang dipaparkan, jadi respons mempunyai bentuk yang sama, ditambah `escalated` (setiap kali parameter ini ditetapkan) dan `stealth: { engine, vendor_detected }` apabila paparan itu berjalan. Peningkatan ini menggunakan semula laluan stealth yang sama seperti [stealth_mode](/docs/api-reference/tools/stealth-mode) dan pintu robots.txt yang sama, dan tidak menambah sebarang pengendalian baharu terhadap pertahanan bot; dinding yang turut menolak paparan itu tetap kembali sebagai halaman disekat dengan `escalated: true`, tanpa caj. Menambah 5 credits, dicaj hanya apabila paparan itu benar-benar berjalan.
Example: true
escalate_engine
stringOptionalplaywright
Enjin pelayar bagi peringkat peningkatan: "playwright" (lalai) atau "camoufox" (berasaskan Firefox, ketahanan pengesanan yang lebih kuat; tersedia hanya di tempat ia dipasang pada backend). Diabaikan melainkan `escalate` ialah `true` dan ambilan biasa disekat.
Example: camoufox
redact_pii
boolean | objectOptionalfalse
Buang data peribadi daripada teks yang dikembalikan oleh panggilan ini, sebelum hasilnya disimpan atau dihantar balik. `true` ialah singkatan bagi `{ mode: "fast" }` — keempat-empat kelas regex, bertag. Setiap kali anda meminta penyuntingan, respons membawa `redaction: { entities, count, mode }` di dalam `data`, walaupun tiada apa-apa yang sepadan (`count: 0`), jadi "tiada apa-apa ditemui" tidak pernah disalah anggap sebagai "parameter itu diabaikan"; kelas tanpa padanan ditinggalkan dan bukan dilaporkan sebagai `0`. Penyuntingan berjalan **sebelum** hasil itu disimpan, jadi hasil besar yang dibaca kemudian dengan [read_result](/docs/api-reference/tools/read-result) sudah pun disunting. Dua batas yang disengajakan: alamat (`url`, `link`, `href`, `canonical_url`) tidak pernah disunting, dan kiraan yang diperoleh daripada teks (`content_length`, `word_count`, `character_count`) menggambarkan teks itu sebagaimana ia diekstrak, sebelum penyuntingan.
Example: true

Mengambil URL

  • Halaman diambil sekali dengan had masa 15 saat. 429 atau 503 yang Retry-After-nya 10 saat atau kurang ditunggu dahulu dan diambil sekali lagi; Retry-After yang lebih panjang atau tiada tidak dicuba semula.
  • HTML, XHTML, XML dan setiap jenis text/* dibaca, dan respons tanpa Content-Type dibaca sebagai HTML. PDF, imej atau fail binari lain mengembalikan 415 UNSUPPORTED_CONTENT_TYPE dengan next_step: "process_document" dan tidak dicaj: bacanya dengan process_document.
  • Badan JSON (application/json atau *+json) dikembalikan seadanya dalam text, dengan amaran the target returned application/json; its body is returned as text. Dengan output_format: "markdown" ia dikembalikan dalam markdown sebaliknya.
  • Halaman yang dipaparkan di sisi klien — kurang daripada 200 aksara teks yang kelihatan dan sama ada <div id="root">, "app" atau "__next" yang kosong atau teks yang menyatakan halaman memerlukan JavaScript ("Enable JavaScript…") — berjaya dengan rendered: false dalam data dan amaran page renders client-side; use scrape dalam warnings apabila tiada paparan stealth berjalan, supaya cengkerang kosong tidak disangka halaman yang pendek. Input html disemak dengan cara yang sama.

Contoh Permintaan

cURL - Extract from URL

terminalBash
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 - Extract from HTML

extractText.tsTypescript
// 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 - Extract with Selector

extract_text.pyPython
# 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]}...")

Contoh Respons

200 OK180ms
{
"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
}
Field Descriptions
data.textKandungan teks biasa yang diekstrak
data.output_format"text" atau "markdown"; panggilan markdown mengembalikan data.markdown menggantikan data.text
data.word_countBilangan perkataan dalam teks yang dikembalikan (nama sama seperti alat MCP)
data.char_countBilangan aksara dalam teks yang dikembalikan
data.truncatedtrue apabila max_length memotong teks (teks itu kemudian berakhir dengan ...); sentiasa ada
data.metadata.word_countJumlah bilangan perkataan dalam teks yang diekstrak
data.metadata.character_countJumlah bilangan aksara
data.metadata.selector_usedPemilih CSS yang telah digunakan
credits_usedCredits ditolak untuk permintaan ini (1 setiap pengekstrakan)

Pengendalian Ralat

Input Hilang (400 Bad Request)

html mahupun url tidak disediakan. Anda mesti menyediakan sekurang-kurangnya satu.

Pemilih Tidak Sah (400 Bad Request)

Pemilih CSS tidak sah atau tidak sepadan dengan sebarang elemen. Sahkan sintaks pemilih anda.

Disekat oleh Dinding Bot (403, 444 atau 502)

Sasaran menjawab dengan halaman cabaran pertahanan bot dan bukannya kandungan, tanpa mengira status HTTP-nya. Responsnya ialah success: false dengan error.code BLOCKED, objek blocked yang menamakan vendor (contohnya cloudflare atau akamai) dan evidence yang digunakan untuk mengecamnya, serta next_step: extract_text with escalate:true, or stealth_mode operation:"scrape". Statusnya ialah status sasaran sendiri apabila ia 403, 404, 410, 429, 444 atau 451, dan 502 dalam kes lain — termasuk dinding yang dihidangkan dengan 200. Tiada credits dicaj. Dengan escalate: true dinding itu dipaparkan sekali dalam pelayar stealth; jika paparan itu juga ditolak, ralat yang sama membawa escalated: true dan tiada next_step.

Sasaran Menjawab dengan Ralat (502 Bad Gateway)

Sasaran menjawab dengan ralat HTTP tanpa dinding bot yang dikenali. error.code ialah UPSTREAM_HTTP dan mesejnya ialah Target answered HTTP <n>. 403, 404, 410, 429, 444 atau 451 dihantar terus sebagai status respons; setiap ralat lain — 5xx, atau 400 atau 401 sasaran sendiri — ialah 502, supaya ia tidak disangka sebagai masalah pada permintaan atau API key anda. 403, 429 atau 444 turut membawa next_step. Tiada credits dicaj.

Disekat oleh robots.txt (403 Forbidden)

robots.txt tapak sasaran melarang laluan ini untuk CrawlForge. Tetapkan respect_robots: false untuk mengatasinya jika anda mempunyai perjanjian sendiri dengan sasaran — tindakan mengatasi itu direkodkan pada API key anda. Tindakan mengatasi itu tidak sampai kepada hos yang berada dalam senarai penarikan diri kekal CrawlForge, yang ditolak tanpa mengira nilai respect_robots.

Jenis Kandungan Tidak Disokong (415 Unsupported Media Type)

Sasaran menghantar PDF, imej atau fail binari lain. error.code ialah UNSUPPORTED_CONTENT_TYPE, mesejnya ialah Unsupported content type <type>: extract_text reads HTML and text, dan next_step ialah process_document. Badannya tidak dibaca, tiada peningkatan dijalankan dan tiada credits dicaj.

Backend Peningkatan Tidak Dikonfigurasikan (503 TOOL_NOT_AVAILABLE)

escalate: true menjalankan peringkat stealth-nya pada backend pelaksanaan CrawlForge. Apabila backend itu tidak dikonfigurasikan, peringkat itu mengembalikan 503 dan tiada credits dicaj.

Kos Credit

1 credit
1 credit setiap permintaan
Setiap pengekstrakan teks berkos 1 credit, tanpa mengira saiz kandungan atau kerumitan pemilih. Dengan escalate: true satu panggilan diunjurkan sehingga 6 credits dan membayar tambahan peningkatan 5 credits hanya apabila ambilan biasa disekat dan paparan stealth berjalan; setiap kegagalan tidak dicaj.

Alat Berkaitan