 中使用 Xberg 提取 gzip 編碼的遠(yuǎn)程文檔)
后端AI 應(yīng)用NLP【免費(fèi)下載鏈接】xbergPolyglot document intelligence with a Rust core: extract text, metadata, images, tables, and structured data from 106 formats across 140 file extensions, plus code intelligence for 371 languages. Fifteen bindings, with CLI, REST API, and MCP server.項(xiàng)目地址https://gitcode.com/gh_mirrors/kr/xberg點(diǎn)擊查看免費(fèi)下載本篇技術(shù)指南聚焦于 Xberg 的 URL 提取能力如何在 KotlinAndroid環(huán)境下通過(guò)extract入口直接抓取一個(gè)以 gzip 壓縮傳輸?shù)倪h(yuǎn)程文檔HTTP 響應(yīng)攜帶Content-Encoding: gzip并在不手動(dòng)解壓的前提下拿到正文內(nèi)容與遠(yuǎn)程 URL 摘要。讀完本文你將掌握ExtractInput、ExtractionConfig與UrlExtractionConfig的 JSON 序列化用法理解mode取值A(chǔ)uto/Document/Crawl對(duì)抓取行為的影響以及倉(cāng)庫(kù)內(nèi)對(duì)應(yīng)的壓縮處理與安全邊界實(shí)現(xiàn)。場(chǎng)景定位URL 提取中的 gzip 傳輸編碼現(xiàn)代 Web 服務(wù)器普遍使用 gzip或 br、deflate壓縮 HTTP 響應(yīng)以節(jié)省帶寬。當(dāng)遠(yuǎn)程文檔本身是普通文本、HTML 或 PDF但傳輸層攜帶Content-Encoding: gzip響應(yīng)頭時(shí)客戶端若不解壓將得到一串亂碼。Xberg 的 URL 攝取路徑會(huì)在抓取階段自動(dòng)處理傳輸層編碼因此調(diào)用方無(wú)需關(guān)心解壓細(xì)節(jié)——這是本指南對(duì)應(yīng)用例extract: remote document served gzip-encoded要驗(yàn)證的核心行為。該場(chǎng)景對(duì)應(yīng)的 e2e 契約定義位于 fixtures/url/url_gzip_encoded_document.json{ mock_responses: [ { path: /, method: GET, status_code: 200, headers: { content-type: text/plain; charsetutf-8, content-encoding: gzip }, body_inline: Remote document hello from Xberg URL e2e. ... } ], extract_input: { kind: uri, uri: $mock_url }, config: { url: { mode: document } }, assertions: [ { type: not_error }, { type: contains, field: results[0].content, value: Remote document hello }, { type: equals, field: summary.remote_urls, value: 1 } ] }契約斷言了三點(diǎn)調(diào)用不報(bào)錯(cuò)not_error解壓后的正文可被檢索到results[0].content包含原文summary.remote_urls精確等于 1。也就是說(shuō)gzip 傳輸編碼在抓取層被透明解壓最終提取結(jié)果與直接抓取未壓縮文檔完全一致。KotlinAndroid調(diào)用示例逐行拆解關(guān)聯(lián)文檔給出的核心代碼片段位于 docs-site/src/snippets-generated/kotlin-android/url/url_gzip_encoded_document.md是一個(gè)可在 Android 側(cè)運(yùn)行的完整 Kotlin 用例import io.xberg.* import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper fun main() kotlinx.coroutines.runBlocking { val mapper jacksonObjectMapper().setPropertyNamingStrategy(com.fasterxml.jackson.databind.PropertyNamingStrategies.SNAKE_CASE) val input mapper.readValue({\kind\:\uri\,\uri\:\https://example.com\}, ExtractInput::class.java) val config mapper.readValue({\url\:{\crawl\:{\ssrf\:{}},\mode\:\document\}}, ExtractionConfig::class.java) val result Xberg.extract(input, config) println(result.results.first().content) println(result.summary.remoteUrls) }1. Jackson 反序列化SNAKE_CASE 命名策略Xberg 的 Kotlin/Android 綁定packages/kotlin-android將 Rust 側(cè)的序列化類型映射為 Java/Kotlin 數(shù)據(jù)類字段采用 snake_case JSON 鍵名。因此示例先用jacksonObjectMapper()構(gòu)造 Jackson Mapper再通過(guò)setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE)讓ExtractInput、ExtractionConfig的 Kotlin 屬性與 JSON 鍵自動(dòng)完成命名映射。這樣ExtractInput(kind uri, uri ...)就能與 Rust 側(cè)ExtractInput的kind/uri字段一一對(duì)應(yīng)。2. ExtractInput以 URI 作為輸入源val input mapper.readValue({\kind\:\uri\,\uri\:\https://example.com\}, ExtractInput::class.java)kind字段取值為uri時(shí)提取引擎會(huì)走 URL 攝取路徑。Rust 側(cè)ExtractInput位于 crates/xberg/src/core/config/extraction/types.rsExtractInput定義于該文件靠前位置kind還支持bytes等其它取值用于直接傳入內(nèi)存字節(jié)。URI 攝取路徑與本地文件的extract/extract_batch共用同一套入口相關(guān)流程說(shuō)明見 docs-site/src/content/docs/guides/url-extraction.mdx。3. ExtractionConfig聲明“單文檔模式”val config mapper.readValue({\url\:{\crawl\:{\ssrf\:{}},\mode\:\document\}}, ExtractionConfig::class.java)配置的核心是url子對(duì)象mode: document表示把該 URI 當(dāng)作單個(gè)遠(yuǎn)程文檔/頁(yè)面處理不進(jìn)行鏈接爬取crawl: { ssrf: {} }是CrawlConfig中的 SSRF 策略對(duì)象{}表示采用默認(rèn)策略即僅放行公開可達(dá)主機(jī)。即便在document模式下url.crawl子對(duì)象依然存在其中ssrf字段約束可訪問(wèn)的主機(jī)/IP 范圍。從源碼看UrlExtractionMode有三個(gè)取值crates/xberg/src/core/config/extraction/types.rs模式行為auto默認(rèn)抓取后對(duì) HTTP(S) 資源做分類識(shí)別document將 URI 視為單個(gè)遠(yuǎn)程文檔/頁(yè)面crawl從種子 URL 出發(fā)爬取逐個(gè)提取發(fā)現(xiàn)的頁(yè)面或下載的文檔4. 結(jié)果讀取val result Xberg.extract(input, config) println(result.results.first().content) println(result.summary.remoteUrls)extract的簽名是fun extract(input: ExtractInput, config: ExtractionConfig): ExtractionResult見 docs-site/src/content/docs/reference/api-kotlin-android.md 中extract()一節(jié)。返回的ExtractionResult中results是提取出的文檔列表results.first().content為解壓后的正文文本summary.remoteUrls對(duì)應(yīng) Rust 側(cè)的summary.remote_urls即本次調(diào)用實(shí)際抓取的遠(yuǎn)程 URL 數(shù)量。對(duì) gzip 用例而言該值恒為 1與契約斷言一致。底層原理gzip 傳輸編碼如何被透明處理抓取層的編碼協(xié)商在mode document下Xberg 通過(guò)底層抓取引擎向目標(biāo) URI 發(fā)起 HTTP GET并在請(qǐng)求頭中聲明可接受的壓縮編碼如 gzip。服務(wù)器若返回Content-Encoding: gzip抓取層會(huì)自動(dòng)解壓響應(yīng)體再交給文檔分類與提取管線。這一過(guò)程對(duì)調(diào)用方完全透明你得到的results[0].content是解壓后的原始正文。本地 gzip 文件提取的對(duì)照實(shí)現(xiàn)為說(shuō)明壓縮處理的安全設(shè)計(jì)可對(duì)照倉(cāng)庫(kù)內(nèi)本地 gzip 文件的提取實(shí)現(xiàn) crates/xberg/src/extraction/archive/gzip.rs。該模塊使用flate2::read::GzDecoder解壓并強(qiáng)制應(yīng)用大小上限以防止“解壓炸彈”decompression bombdecompress_gzip_limited(bytes, max_size)通過(guò)decoder.take(max_size 1)限制讀取字節(jié)數(shù)解壓結(jié)果超過(guò)max_archive_size時(shí)返回Gzip decompressed size exceeds ... byte limit校驗(yàn)錯(cuò)誤gzip.rs解壓后若檢測(cè)到 TAR 頭偏移 257 處的ustar魔數(shù)會(huì)委托給 TAR 提取邏輯即.tar.gz這類嵌套容器也會(huì)被自動(dòng)識(shí)別gzip.rs。雖然 URL 抓取路徑的傳輸層解壓與本地歸檔解壓屬于兩條不同代碼路徑但倉(cāng)庫(kù)在壓縮數(shù)據(jù)處理上普遍貫徹“有限大小、拒絕膨脹”的安全原則對(duì)應(yīng)歸檔格式的測(cè)試覆蓋可參見 crates/xberg/src/extraction/archive/tests/gzip_and_limits.rs。配置參數(shù)參考UrlExtractionConfig 與安全邊界UrlExtractionConfigcrates/xberg/src/core/config/extraction/types.rs除了mode與crawl還包含以下字段字段默認(rèn)值作用document_url_patternNone對(duì)文檔類 URL 的正則過(guò)濾max_document_urls_per_result100每次提取結(jié)果最多跟隨的 URL 數(shù)max_total_urls1000單次調(diào)用跨全部結(jié)果最多跟隨的 URL 數(shù)allow_local_file_inputstrue是否允許裸本地文件系統(tǒng)路徑輸入allow_file_uristrue是否允許本地file://URI 輸入CrawlConfig默認(rèn)值偏向“禮貌且有界”的抓取max_depth1、max_pages100、max_concurrent10、respect_robots_txttrue、stay_on_domaintrue見 types.rs。SSRF 防護(hù)處理不可信 URL 的關(guān)鍵抓取用戶提供的 URL 本身就是一個(gè) SSRF 攻擊面。CrawlConfig.ssrfSsrfPolicy決定哪些主機(jī)與 IP 段可達(dá)在 REST/MCP 等面向調(diào)用者的入口中ssrf、proxy、max_redirects、瀏覽器端點(diǎn)等operator-owned字段會(huì)被顯式拒絕——見 crates/xberg/src/core/config/request_security.rs 中validate_caller_extraction_config的實(shí)現(xiàn)它調(diào)用crawlberg::reject_untrusted_fields拒絕含ssrf在內(nèi)的敏感抓取字段并拒絕 LLM 相關(guān)路徑下的api_key、base_url、headers、providers等傳輸/憑據(jù)字段。實(shí)踐建議對(duì)不可信種子保持respect_robots_txt與stay_on_domain開啟顯式設(shè)置max_pages/max_total_urls上限在服務(wù)端場(chǎng)景中ssrf: {}默認(rèn)策略即可作為第一道防線。從契約到測(cè)試如何在倉(cāng)庫(kù)中驗(yàn)證該行為該用例屬于 alef 生成的 e2e 契約snippet 文件頭部注明This file is auto-generated by alef — DO NOT EDIT.level: typecheck、side_effect: server通過(guò)alef e2e generate重新生成。與之對(duì)應(yīng)的契約 JSON 與斷言見 fixtures/url/url_gzip_encoded_document.json同目錄下還有url_crawl_linked_pages.json、url_html_page_extract.json、url_remote_text_document.json等兄弟用例覆蓋 URL 提取的各類分支fixtures/url/url_batch_mixed_inputs.json — URI 與字節(jié)輸入混合批量提取fixtures/url/url_crawl_linked_pages.json — 爬取模式與鏈接跟隨fixtures/url/url_remote_text_document.json — 普通文本遠(yuǎn)程文檔。你可以通過(guò) e2e 測(cè)試框架參見 scripts/e2e/run-with-mock-server.sh啟動(dòng) mock 服務(wù)器返回?cái)y帶content-encoding: gzip頭的響應(yīng)體來(lái)復(fù)現(xiàn)該場(chǎng)景驗(yàn)證results[0].content與summary.remoteUrls的斷言。小結(jié)在 KotlinAndroid中提取 gzip 編碼的遠(yuǎn)程文檔只需三步用 SNAKE_CASE 策略的 Jackson Mapper 反序列化ExtractInputkinduri與ExtractionConfigurl.modedocument、url.crawl.ssrf{}調(diào)用Xberg.extract再?gòu)膔esults.first().content與summary.remoteUrls讀取結(jié)果。傳輸層 gzip 由抓取引擎自動(dòng)解壓無(wú)需調(diào)用方介入涉及不可信 URL 時(shí)務(wù)必保留 SSRF 默認(rèn)策略并設(shè)置明確的抓取上限。贊分享后端AI 應(yīng)用NLP【免費(fèi)下載鏈接】xbergPolyglot document intelligence with a Rust core: extract text, metadata, images, tables, and structured data from 106 formats across 140 file extensions, plus code intelligence for 371 languages. Fifteen bindings, with CLI, REST API, and MCP server.項(xiàng)目地址https://gitcode.com/gh_mirrors/kr/xberg點(diǎn)擊查看免費(fèi)下載相關(guān)推薦CANN基礎(chǔ)設(shè)施SIG詳解面向開源項(xiàng)目的開發(fā)者與用戶服務(wù)平臺(tái)CANN基礎(chǔ)設(shè)施SIG詳解面向開源項(xiàng)目的開發(fā)者與用戶服務(wù)平臺(tái) CANN 社區(qū)基礎(chǔ)設(shè)施 SIGSpecial Interest Group是 CANN 開源后端AI 應(yīng)用NLPXberg C 綁定實(shí)戰(zhàn)從 gzip 編碼的遠(yuǎn)程文檔中提取文本Xberg C 綁定實(shí)戰(zhàn)從 gzip 編碼的遠(yuǎn)程文檔中提取文本 本文基于 Xberg 的 C 綁定講解如何通過(guò) XbergConverter.Extract后端AI 應(yīng)用NLP在 KotlinAndroid中使用 Xberg 遞歸提取 URL 文檔鏈接在 KotlinAndroid中使用 Xberg 遞歸提取 URL 文檔鏈接 遞歸 URL 提取recursive URL extraction是 Xb后端AI 應(yīng)用NLP上一篇Gromit-MPX與同類工具對(duì)比為什么它是Linux最佳屏幕標(biāo)注工具下一篇3步搞定CATIA自動(dòng)化pycatia完整教程讓設(shè)計(jì)效率翻倍創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考