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
/api/v1/tools/extract_textParameters
Nota: Anda mesti menyediakan sama ada html atau url. Jika kedua-duanya disediakan, html diberi keutamaan.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
html | string | Optional | - | Kandungan HTML untuk mengekstrak teks (sediakan sama ada html atau url) Example: <html><body><h1>Hello World</h1></body></html> |
url | string | Optional | - | URL untuk diambil dan diekstrak teksnya (sediakan sama ada html atau url) Example: https://example.com/article |
selector | string | Optional | - | Pemilih CSS untuk menyasarkan elemen tertentu (lalai: keseluruhan halaman) Example: article, .content, #main |
clean | boolean | Optional | true | 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 | boolean | Optional | false | 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 | boolean | Optional | false | 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 | number | Optional | - | 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 | string | Optional | text | `"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 | boolean | Optional | true | 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 | boolean | Optional | false | 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 | string | Optional | playwright | 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 | object | Optional | false | 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-Afteryang lebih panjang atau tiada tidak dicuba semula. - HTML, XHTML, XML dan setiap jenis
text/*dibaca, dan respons tanpaContent-Typedibaca sebagai HTML. PDF, imej atau fail binari lain mengembalikan415 UNSUPPORTED_CONTENT_TYPEdengannext_step: "process_document"dan tidak dicaj: bacanya dengan process_document. - Badan JSON (
application/jsonatau*+json) dikembalikan seadanya dalamtext, dengan amaranthe target returned application/json; its body is returned as text. Denganoutput_format: "markdown"ia dikembalikan dalammarkdownsebaliknya. - 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 denganrendered: falsedalamdatadan amaranpage renders client-side; use scrapedalamwarningsapabila tiada paparan stealth berjalan, supaya cengkerang kosong tidak disangka halaman yang pendek. Inputhtmldisemak dengan cara yang sama.
Contoh Permintaan
cURL - Extract from 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 - Extract from 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 - Extract with 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]}...")Contoh Respons
{ "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.textKandungan teks biasa yang diekstrakdata.output_format"text" atau "markdown"; panggilan markdown mengembalikan data.markdown menggantikan data.textdata.word_countBilangan perkataan dalam teks yang dikembalikan (nama sama seperti alat MCP)data.char_countBilangan aksara dalam teks yang dikembalikandata.truncatedtrue apabila max_length memotong teks (teks itu kemudian berakhir dengan ...); sentiasa adadata.metadata.word_countJumlah bilangan perkataan dalam teks yang diekstrakdata.metadata.character_countJumlah bilangan aksaradata.metadata.selector_usedPemilih CSS yang telah digunakancredits_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
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
Bersedia untuk mengekstrak teks bersih? Daftar secara percuma dan dapatkan 1,000 credits untuk bermula.