news 2026/9/29 3:00:18

xberg Elixir 表格提取实战:通过 `tables.cells` 与 `tables.markdown` 访问结构化表格数据

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
xberg Elixir 表格提取实战:通过 `tables.cells` 与 `tables.markdown` 访问结构化表格数据
  • 后端
  • AI 应用
  • NLP

【免费下载链接】xberg

Polyglot 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 契约用例(contract fixture)table_access为主线,讲解如何通过Xberg.ExtractInput与Xberg.extract_async/2从 HTML 文档中提取结构化表格,并逐一访问每个表格的单元格数组与 Markdown 渲染结果。读完本文,你将掌握 xberg Elixir 绑定的表格提取调用方式、tables字段的数据形态,以及契约测试对提取结果的校验口径,可直接用于文档解析、RAG 数据准备等场景。

契约用例概述:table_access到底在测什么

docs-site/src/snippets-generated/elixir/contract/table_access.md是 xberg 仓库中由 alef 工具自动生成的契约(contract)代码片段,其配套的契约定义位于 fixtures/contract/table_access.json。该用例的核心目标只有一个:从 HTML 输入中提取表格,并迭代访问表格的结构化单元格(cells)与 Markdown 输出(markdown)。

在 table_access.json 中,用例被描述为:

  • topic:contract,即跨语言契约一致性用例;
  • title:Access extracted tables;
  • description:Iterate through structured table cells and Markdown output;
  • tags:contract、tables、html;
  • call:extract,走的是单文档提取入口;
  • side_effects:server,即需要 mock server 提供远程 HTML 文档。

这意味着该用例不只验证 Elixir 一种语言,而是通过同一份 JSON 契约驱动 Java、Rust、Go、Python、TypeScript、C#、Ruby、Swift、Dart、Zig、PHP、Kotlin 等全部绑定生成等价代码(仓库中 docs-site/src/snippets-generated 下每个语言目录的contract/table_access.md均由同一 fixture 生成),从而保证“表格提取结果”在所有语言绑定上结构一致。本文聚焦 Elixir 版本,但其中对tables[].cells与tables[].markdown的理解,可直接平移到其他绑定。

构造输入:Xberg.ExtractInput结构体

在 Elixir 绑定中,所有公开提取入口都接收统一输入结构体Xberg.ExtractInput。其定义位于 packages/elixir/lib/xberg/extract_input.ex,类型声明如下:

@type t :: %__MODULE__{ kind: Xberg.ExtractInputKind.t(), bytes: binary() | nil, uri: String.t() | nil, mime_type: String.t() | nil, filename: String.t() | nil, config: Xberg.FileExtractionConfig.t() | nil } defstruct kind: :uri, bytes: nil, uri: nil, mime_type: nil, filename: nil, config: nil

契约用例使用的是uri输入方式,即让引擎去抓取远程文档:

input_value = %Xberg.ExtractInput{ kind: "uri", mime_type: "text/html", uri: "https://example.com/html/simple_table.html" }

各字段的语义如下:

字段取值说明
kind"uri"或"bytes"输入来源:uri表示按地址抓取,bytes表示直接传入二进制内容
mime_type"text/html"等声明文档类型,帮助引擎选择正确的提取器
uri文档 URL当kind为uri时必填,指向待解析文档
bytes二进制当kind为bytes时填充,本例未使用
filename文件名可选,用于推断格式
config提取配置可选,按文件粒度覆盖全局配置

注意Xberg.ExtractInput实现了Jason.Encoder,在 extract_input.ex 中会剔除所有nil字段后再序列化,因此未使用的bytes、filename、config不会出现在请求负载中。

发起提取:Xberg.extract/1与extract_async/2

契约用例直接调用Xberg.extract_async(input_value, "{}"),其中第二个参数是字符串形式的配置(这里为空对象"{}",表示使用全部默认配置)。在高阶 API 层,packages/elixir/lib/xberg.ex 还提供了更符合 Elixir 惯例的关键字参数封装:

@spec extract(keyword()) :: {:ok, map()} | {:error, atom, String.t()} def extract(opts \\ []) do Xberg.Native.extract_async( case Keyword.get(opts, :input) do nil -> nil v when is_binary(v) -> v v -> Jason.encode!(v) end, case Keyword.get(opts, :config) do nil -> nil v when is_binary(v) -> v v -> Jason.encode!(v) end ) end

也就是说,input既可以是已编码的 JSON 字符串,也可以是任意结构(自动通过Jason.encode!/1序列化)。等价写法可以是:

input_value = %Xberg.ExtractInput{ kind: "uri", mime_type: "text/html", uri: "https://example.com/html/simple_table.html" } {:ok, result} = Xberg.extract(input: input_value, config: "{}")

extract_async/2底层由 NIF(Xberg.Native,见 packages/elixir/lib/xberg/native.ex 与 packages/elixir/native/xberg_nif/src/lib.rs)转发给 Rust 核心引擎,返回{:ok, map()} | {:error, atom, String.t()}。若需同时处理多个文档,可使用 xberg.ex 中的extract_batch/1。

读取结果:results[0].tables中的cells与markdown

提取结果按“文档 → 结果列表”组织,result.results中每个元素对应一个输入文档(单输入时索引为 0)。契约用例的核心迭代逻辑如下:

Enum.each(Enum.at(result.results, 0).tables, fn table -> IO.inspect(table.cells) IO.inspect(table.markdown) end)

这里揭示了tables元素的两种访问方式:

  • table.cells:结构化单元格数据,通常表现为按行组织的单元格集合(含行列坐标、文本内容等),适合程序化处理——例如把单元格填入二维数组、做数值清洗或喂给下游模型;
  • table.markdown:同一表格渲染成 Markdown 表格语法(| Product | Category |形式)的文本,适合直接嵌入 Markdown 文档、LLM 提示词或用于人类阅读。

table.cells与table.markdown是同一表格的两种视角:前者是结构化的机器可读形态,后者是便于人读和落盘的文本形态。在实际管线中,常见做法是先用cells做结构化校验/转换,再用markdown直接输出或入库。

契约断言:提取结果的验收标准

契约用例的“正确性”由 fixtures/contract/table_access.json 中的assertions定义,共三条,可作为我们调试时的验收清单:

{ "assertions": [ { "type": "equals", "field": "results[0].mime_type", "value": "text/html" }, { "type": "count_min", "field": "results[0].tables", "value": 2 }, { "type": "contains_all", "field": "results[0].tables[0].markdown", "values": ["Product", "Category", "Laptop", "$999.99"] } ] }

含义分别为:

  1. results[0].mime_type == "text/html":引擎正确识别了输入文档的 MIME 类型;
  2. results[0].tables数量 ≥ 2:示例 HTML 至少被识别出两张表格;
  3. tables[0].markdown同时包含Product、Category、Laptop、$999.99:第一张表的 Markdown 文本完整保留了表头(Product / Category)与首行数据(Laptop / $999.99),即表头、单元格文本都没有丢失。

第三条对表格提取质量提出了硬性要求:Markdown 输出必须保留原始表格的所有文本信息,这正是在线表格解析(HTML 表格 → 结构化数据 → Markdown)的核心验收点。该 fixture 还通过mock_responses配置了https://example.com/html/simple_table.html的 mock 响应(status_code: 200,content-type: text/html),说明该用例由scripts/e2e/run-with-mock-server.sh这类 mock server 支撑运行,不依赖真实外网。

契约一致性:同一用例在 Python / TypeScript 中的形态

table_access是跨语言契约,因此理解 Elixir 写法后,对照其他绑定可以更清楚地看出“哪些是引擎能力、哪些是语言封装”。以 Python 版本 为例:

from xberg import extract, ExtractInput, ExtractInputKind from xberg._xberg import ExtractionConfig input = ExtractInput(kind=ExtractInputKind("uri"), mime_type="text/html", uri="https://example.com/html/simple_table.html") config = ExtractionConfig.from_json("{}") result = await extract(input, config) for table in result.results[0].tables: print(table.cells) print(table.markdown)

再以 TypeScript 版本 为例:

const input: ExtractInput = { kind: ExtractInputKind.Uri, mimeType: "text/html", uri: "https://example.com/html/simple_table.html" }; const result = await extract(input); for (const table of result.results[0]?.tables ?? []) { console.log(table.cells); console.log(table.markdown); }

三种语言的骨架完全一致:构造ExtractInput(uri + mime_type)→ 调用extract→ 遍历results[0].tables→ 访问cells与markdown。这印证了表格提取的结果模型是引擎级统一约定,语言绑定只负责序列化与类型封装。

实战要点与扩展方向

  1. 表格提取不限于 HTML:本例以text/html演示,但 xberg 的提取引擎覆盖 106 种格式(详见 README.md 中的格式清单),PDF、DOCX、XLSX 等文档中的表格同样会进入results[].tables,只是cells的坐标与文本组织方式随来源略有差异。
  2. 用cells做结构化处理,用markdown做人读输出:需要数值运算、单元格对齐或按行列过滤时优先读cells;需要把结果直接粘进文档、提示词或数据库时用markdown。
  3. 善用契约断言做回归验证:在集成测试中可仿照table_access.json的count_min与contains_all写法,对真实文档断言“至少提取 N 张表”和“关键文本不丢失”,这是保障解析质量的最低成本手段。
  4. 异步 API 语义:extract_async/2在 NIF 层以异步方式执行,避免阻塞 BEAM 调度器,适合在 Phoenix 或 GenServer 中并发调用;批量场景优先使用extract_batch/1以减少往返。

本文对应的完整可运行契约代码位于 docs-site/src/snippets-generated/elixir/contract/table_access.md,其生成源与断言定义位于 fixtures/contract/table_access.json;Elixir 绑定 API 可继续查阅 packages/elixir/lib/xberg.ex 与 packages/elixir/lib/xberg/extract_input.ex。

  • 后端
  • AI 应用
  • NLP

【免费下载链接】xberg

Polyglot 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
点击查看免费下载

相关推荐

上一篇:RTranslator:Android 完全离线实时语音翻译应用,3 种模式与 1.2GB 模型配置指南
下一篇:终极指南:如何用Twinkle Tray轻松掌控Windows多显示器亮度

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/29 2:58:14

【Codex教育管理系统】用座位划分生成班级座位表与导出任务

座位划分面向班主任的真实排座场景,结合班级、考试成绩、性格测评和座位规则生成可用座位表。 本文基于 SeatAllocationViewSet 和座位工作台页面,把班级选择、考试联动、规则计算和导出任务转换为 Codex 项目代码生成任务。 文章目录 设计与需求 后端设计 前端设计 扩展功能…

作者头像 李华
网站建设 2026/9/29 2:57:59

【Codex教育管理系统】用使用文档沉淀后台操作说明

使用文档在教育管理系统中的价值,在于围绕 使用文档 的核心字段、接口动作和页面状态维护业务数据。模块需要和现有接口、权限、页面状态保持一致,不能只写成普通后台表格。 本文基于 系统功能/智能助手_使用文档 对应源码,把业务目标拆成模型字段、接口规则、页面交互和验收…

作者头像 李华
网站建设 2026/9/29 2:57:33

【Codex教育管理系统】用班级设置维护教学班级层级数据

班级设置是教育管理系统中学生分班、行政班管理和选科走班的基础配置模块。它维护班级类型、年级分类、父子层级和启用状态,为学生管理、考试安排和班级分析提供统一班级口径。 本文基于 StudentClasses 模型、StudentClassesViewSet、Excel 初始化接口和 FastCrud 树表页面,…

作者头像 李华
网站建设 2026/9/29 2:57:24

【Codex教育管理系统】用项目提示词库管理AI项目生成模板

教育管理系统项目提示词用Codex自动生成项目代码 管理项目级 Prompt 模板、分类树、提示词说明和初始化数据包,为内容生成类工具提供可复用提示词资产。它在教育管理系统里承担内容沉淀、资源配置或业务流转职责,后续页面、接口和权限都需要围绕这条业务主线设计。 本文基于…

作者头像 李华
网站建设 2026/9/29 2:57:17

【Codex教育管理系统】用整合教案串联PPT文案与多类型教学资源

维护多类型教案内容,包括 PPT故事板、NotebookLM、传统文档和 Agent 图文,并支持图片转换、Prompt 构建、资源导出和批量任务。 它在教育管理系统中承接教学资源生产、教案组织和课堂内容交付,不能只按后台表格维护来理解。 本文基于 server_backend/modules/TeachingCenter…

作者头像 李华