后端AI 应用NLP【免费下载链接】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.项目地址https://gitcode.com/gh_mirrors/kr/xberg点击查看免费下载本文聚焦 Xberg 的 KotlinAndroid语言绑定讲解如何通过Xberg.extract()以 URI 方式拉取远程 HTML 文档并从抽取结果中读取结构化表格tables[].cells。你将掌握ExtractInput/ExtractionConfig的 JSON 构造方式、SSRF 安全策略的必要性、表格结果字段的含义以及如何在 Android 与 JVM 环境中运行同样的抽取代码。场景与目标HTML 是 Web 上最常见的文档格式而表格table通常是页面中最有价值的结构化数据。Xberg 的 HTML 提取器会将 HTML 转换为带结构的内部文档把每个table还原成独立的Table对象包含二维单元格网格与 Markdown 渲染文本供下游做 RAG、数据入库或报表分析。仓库中 docs-site/src/snippets-generated/kotlin-android/smoke/smoke_html_basic.md 正是针对这一能力的冒烟测试文档它以一个最小可运行片段验证通过 URI 输入 URL 配置抽取远程 HTML 表格的完整链路。本文以该片段为主体结合 packages/kotlin-android 的绑定源码与 crates/xberg/src/extractors/html.rs 的提取器实现逐层拆解这段代码。完整冒烟测试代码原文档给出的 KotlinAndroid冒烟测试如下它覆盖了三条关键链路Jackson 反序列化输入、调用原生抽取、遍历表格单元格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\,\mime_type\:\text/html\,\uri\:\https://example.com/html/simple_table.html\}, ExtractInput::class.java) val config mapper.readValue({\url\:{\crawl\:{\ssrf\:{}}}}, ExtractionConfig::class.java) val result Xberg.extract(input, config) for (table in result.results.first().tables) { println(table.cells) } }接下来我们按输入对象 → 配置对象 → 抽取调用 → 结果消费四步解析每一行代码的底层含义。ExtractInput声明抽取来源ExtractInput是所有公开抽取入口的统一输入类型定义在 packages/kotlin-android/src/main/kotlin/io/xberg/ExtractInput.ktkind来源类型URI默认或Bytesbytes模式要求提供bytesuri模式要求提供uribytes原始字节数组用于内存中直接抽取uri本地路径、file://URI 或 HTTP(S) URLmimeTypeMIME 类型提示帮助正确路由到 HTML 提取器filename文件名提示参与 MIME 探测与元数据记录config单文件级抽取覆盖配置。冒烟测试里{kind:uri,mime_type:text/html,uri:https://example.com/html/simple_table.html}明确声明了远程 URL HTML 类型。在 e2e/kotlin_android/src/test/kotlin/io/xberg/e2e/SmokeTest.kt 的testSmokeHtmlBasic中该 URL 指向 MockServer 提供的simple_table.html夹具测试随后断言mimeType text/html并确认内容包含 Sample Data Table、Laptop、Electronics、Product 等表格关键词——说明表格内容确实进入了抽取文本。ExtractionConfigURL 抽取与 SSRF 防护ExtractionConfig是主抽取配置见 packages/kotlin-android/src/main/kotlin/io/xberg/ExtractionConfig.kt它含大量可选字段OCR、分块、关键词、布局检测、结构化抽取等。其中url: UrlExtractionConfig为必填字段这是所有 URL 类输入都要跨过的门槛因此冒烟测试必须显式给出{url:{...}}。url 字段的三层结构{url:{crawl:{ssrf:{}}}}从外到内对应三个数据类UrlExtractionConfigUrlExtractionConfig.ktURL 抽取模式mode默认AUTO、必填的crawl配置、文档 URL 正则过滤documentUrlPattern、每结果最大 URL 数maxDocumentUrlsPerResult默认 100、整次调用最大 URL 数maxTotalUrls默认 1000以及是否允许本地文件输入allowLocalFileInputs/allowFileUris。CrawlConfigCrawlConfig.kt爬取深度maxDepth、页面上限maxPages、每页链接上限maxLinksPerPage、并发maxConcurrent、遍历策略crawlStrategy默认 BFS、robots.txt 遵守respectRobotsTxt、UA 与自定义头、超时与重试、域名边界stayOnDomain/allowSubdomains、路径过滤includePaths/excludePaths、文档下载downloadDocuments默认 true上限 50 MB等。SsrfPolicyCrawlConfig 的必填字段ssrf。冒烟测试写{ssrf:{}}即使用默认策略denyPrivate默认为true拒绝私有网络、仅允许 http/https、最大 5 次重定向见 SsrfPolicy.kt。这是服务端抽取远程 URL 时的第一道安全闸门——防止 SSRF 攻击把请求打到内网。注意CrawlConfig 文档特别指出在 wasm32含 Node.js目标上deny_private无法阻止基于域名的请求该目标无 DNS 解析Android/JVM 原生绑定不受此限制如需在 wasm 部署应在网络层强制出口限制。Xberg.extract从 Kotlin 到 Rust 的桥接Xberg是绑定门面对象extract()定义于 packages/kotlin-android/src/main/kotlin/io/xberg/Xberg.ktfun extract(input: ExtractInput, config: ExtractionConfig): ExtractionResult { val resultJson XbergBridge.nativeExtract(mapper.writeValueAsString(input), mapper.writeValueAsString(config)) return mapper.readValue(resultJson, ExtractionResult::class.java) }调用链为Kotlin 侧将ExtractInput/ExtractionConfig序列化为 JSON → 经XbergBridge的 JNI 桥接传给 Rust 核心 → 抽取完成后把结果 JSON 反序列化回ExtractionResult。这里有两个绑定层的实现细节值得注意同样在 Xberg.kt全局 mapper 强制SNAKE_CASE命名策略因此 Kotlin 属性mimeType在 JSON 线协议中是mime_type与 Rust serde 端一致——这也是冒烟测试里 JSON 键必须写mime_type的原因绑定注册了自定义ByteArray序列化器把字节数组编为无符号数字数组而非 Jackson 默认的 Base64 字符串匹配 RustVecu8的 wire 格式若要用kind bytes方式传 HTML必须走这套 mapper。此外Xberg还提供extractBatch()批量、mapUrl()先发现站点 URL 清单再决定是否抽取等同族 API可满足多文档场景。消费结果tables[].cells 的含义抽取结果ExtractionResult含results列表每一项是ExtractedDocument。对 HTML 输入tables字段携带全部结构化表格每个Table的核心字段为cells二维字符串数组ListListString按文档顺序逐行列出每个单元格的文本markdown该表格的 Markdown 渲染文本page_number表格所在页码。冒烟测试用for (table in result.results.first().tables) println(table.cells)逐表打印单元格矩阵正是读取 HTML 表格最直接的方式。提取器侧的实现印证在 Rust 核心侧HTML 提取器位于 crates/xberg/src/extractors/html.rs。它调用统一转换器convert_html_to_markdown_with_tables生成内容文本与TableData见第 585-591 行并经由HC::Table { grid }分支把TableGrid重建为crate::types::Table第 134-143 行第 827-847 行的单测test_extract_html_tables_basic直接验证了基本表格的抽取行为let html r# table trthHeader1/ththHeader2/th/tr trtdRow1Col1/tdtdRow1Col2/td/tr trtdRow2Col1/tdtdRow2Col2/td/tr /table #; let tables extract_tables(html); assert_eq!(tables.len(), 1); assert_eq!(table.cells.len(), 3); // 3 行含表头 assert_eq!(table.cells[0], vec![Header1, Header2]); assert_eq!(table.cells[1], vec![Row1Col1, Row1Col2]);也就是说th表头行同样进入cells[0]后续tr依次对应cells[1..]且每个表格附带markdown渲染与page_number——这与 Kotlin 侧冒烟测试的消费方式完全对应。该文件第 413-447 行还有recover_table_captions由于底层html-to-markdown-rs的TableGrid不保留caption提取器会在文档顺序上把第 N 个caption文本作为段落插到第 N 个表格之前保证标题信息不丢失。若你的页面用caption描述表格抽取后的content文本里会出现对应说明文字。从冒烟测试到真实应用参数扩展建议冒烟测试刻意保持最小配置实际接入时可基于同一个ExtractionConfig骨架做增量调整所有字段均可通过 JSON 或 Kotlin 构造器赋值限制爬取范围给crawl增加max_pages、max_depth、include_paths/exclude_paths、respect_robots_txt控制远程站点的抓取规模自定义请求行为设置user_agent、custom_headers、request_timeout序列化为毫秒、rate_limit_ms、retry_count输出格式设output_format: markdown让正文以 Markdown 返回同时table_anchors: true可在渲染文本中插入[TABLE:{table_id}]锚点便于把 Markdown 表格块与结构化tables[]条目互相索引安全加固保持ssrf.deny_private: true默认并按需配置allowlist/denylistIP 范围批量场景改用Xberg.extractBatch(listOf(input1, input2), config)并可设置extraction_timeout_secs默认 600 秒与max_concurrent_extractions。运行环境说明该冒烟测试同时适用于 JVM 桌面与 Android 环境Xberg.extract是挂起安全的同步桥接调用内部经Dispatchers切换示例用runBlocking包裹仅为演示同步输出绑定源码位于 packages/kotlin-android/src/main/kotlin/io/xberg为 alef 生成的只读代码字段语义以源码注释为准端到端验证可参考 e2e/kotlin_android/src/test/kotlin/io/xberg/e2e/SmokeTest.kt其testSmokeHtmlBasic通过 MockServer 夹具对同一输入做断言级验证MIME 类型、内容长度与表格关键词。小结通过这一最小冒烟测试你可以掌握 Xberg Kotlin 绑定抽取远程 HTML 表格的完整范式用ExtractInput声明uri来源、用ExtractionConfig携带必填的url.crawl.ssrf安全配置、经Xberg.extract()拿到ExtractionResult后遍历tables[].cells。在此基础上UrlExtractionConfig的边界控制、CrawlConfig的爬取策略与SsrfPolicy的安全默认值构成了面向真实 Web 数据抽取的可扩展底座。赞分享后端AI 应用NLP【免费下载链接】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.项目地址https://gitcode.com/gh_mirrors/kr/xberg点击查看免费下载相关推荐xberg Elixir 实战用 ExtractInput 与 extract_async 提取 HTML 表格Smoke Test 全解析xberg Elixir 实战用 ExtractInput 与 extract_async 提取 HTML 表格Smoke Test 全解析 本文以 xb后端AI 应用NLPxberg Go 绑定 URI 抽取实战用 ExtractInput 从 HTTP(S)/本地路径提取 PDF 文本xberg Go 绑定 URI 抽取实战用 ExtractInput 从 HTTP S /本地路径提取 PDF 文本 本文围绕 docs site/src/s后端AI 应用NLPXberg Elixir 绑定实战用 extract_async 与 ExtractInput 实现 PDF 文本提取Xberg Elixir 绑定实战用 extract_async 与 ExtractInput 实现 PDF 文本提取 本篇指南聚焦于 Xberg 项目Po后端AI 应用NLP上一篇Readest Duokan 全屏封面渲染修复实战解析5263 的 Letterbox、空白页与滑动失效三案下一篇Model Builder Managed Agent 部署指南基于 Claude 多代理模板构建 DCF/LBO/三表/comps 估值模型创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考