ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Xberg C 绑定实战:从 gzip 编码的远程文档中提取文本

Xberg C 绑定实战:从 gzip 编码的远程文档中提取文本 后端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 的 C# 绑定讲解如何通过XbergConverter.ExtractAsync从 HTTP 服务器返回的 gzip 压缩文档中透明提取文本内容。你将掌握 URL 提取模式UrlExtractionMode的用法、ExtractionConfig的配置方式以及仓库中 mock 服务器、e2e 测试与 gzip 解压实现背后的完整技术链路。文中的代码与配置均来自当前仓库的真实生成片段和测试用例可直接复制运行。一、应用场景为什么需要处理 gzip 编码的远程文档在真实网络中HTTP 服务器为降低带宽消耗常常对响应体启用Content-Encoding: gzip或 deflate、br压缩。这意味着客户端通过 URL 抓取到的原始字节并非可直接解析的文档内容而是压缩流。若提取管线不透明处理传输编码轻则解析失败重则把压缩字节误判为二进制文件。Xberg 的 URL 抓取链路在设计上把抓取 传输编码解码与文档格式解析分离抓取层负责跟随 URI 拿到响应并还原出原始文档字节提取层再按 MIME 类型走对应的格式解析器。因此用户无需关心远端是否压缩只需在调用时指定 URL 提取模式即可。仓库中的 e2e 场景extract: remote document served gzip-encoded正是对这一行为的直接验证。二、完整可运行示例C# 提取 gzip 远程文档原文档 url_gzip_encoded_document.md 给出了一个 typecheck 级别的 C# 代码片段核心调用如下using System; using System.Text.Json; using Xberg; var ConfigOptions new JsonSerializerOptions { PropertyNameCaseInsensitive true }; var result await XbergConverter.ExtractAsync( new ExtractInput { Kind JsonSerializer.DeserializeExtractInputKind(\uri\, ConfigOptions)!, Uri https://example.com }, new ExtractionConfig { Url new UrlExtractionConfig { Mode JsonSerializer.DeserializeUrlExtractionMode(\document\, ConfigOptions)! } }); Console.WriteLine(result.Results[0].Content); Console.WriteLine(result.Summary.RemoteUrls);拆解这段代码可以看到四个关键点输入类型ExtractInput的Kind被显式反序列化为uri配合Uri字段声明这是一个按 URL 抓取的输入而非bytes或file输入。大小写不敏感反序列化JsonSerializerOptions { PropertyNameCaseInsensitive true }允许 JSON 字段名与 C# 属性名宽松匹配这也是生成片段里统一使用的配置风格。模式选择UrlExtractionConfig.Mode设置为document明确告诉引擎把该 URI 当作单个远程文档处理而不是去抓取页面里的链接。结果读取提取文本位于result.Results[0].Contentresult.Summary.RemoteUrls则统计本次调用实际抓取到的远程 URL 数量。值得说明的是Mode用字符串反序列化是为了与各语言绑定保持一致的 JSON 契约——在 e2e 测试中同样如此。完整的可运行版本见 UrlTests.cs[Fact] public async Task Test_UrlGzipEncodedDocument() { // extract: remote document served gzip-encoded var Input_MockBaseUrl Environment.GetEnvironmentVariable(MOCK_SERVER_URL_GZIP_ENCODED_DOCUMENT) ?? Environment.GetEnvironmentVariable(MOCK_SERVER_URL) /fixtures/url_gzip_encoded_document; var Input_Json {\kind\:\uri\,\uri\:\$mock_url\}.Replace($mock_url, Input_MockBaseUrl); var result await XbergConverter.ExtractAsync( ExtractInput.FromJson(Input_Json), ExtractionConfig.FromJson({\url\:{\mode\:\document\}})); Assert.Contains(Remote document hello, result.Results[0].Content.ToString()); Assert.True(result.Summary.RemoteUrls 1); }该测试与生成片段等价区别在于它面向真实 mock 服务器MOCK_SERVER_URL指向测试环境$mock_url会被替换为fixtures/url_gzip_encoded_document路径从而拿到一个真正以 gzip 传输编码返回的远程文档。三、配置解析UrlExtractionConfig 与 UrlExtractionModeURL 提取的配置结构定义在 types.rs核心字段如下字段类型默认值作用modeUrlExtractionModeautoURL 提取模式crawlCrawlConfig见下文默认策略抓取行为控制深度、页数、并发等document_url_patternOptionStringNone文档模式下对发现 URL 的正则过滤max_document_urls_per_resultOptionu32100每个提取结果最多跟随的 URL 数max_total_urlsOptionu321000单次提取调用全程最多跟随的 URL 总数allow_local_file_inputsbooltrue是否允许裸本地文件系统路径输入allow_file_urisbooltrue是否允许本地file://URI 输入其中UrlExtractionMode是枚举类型定义了三种模式源码注释见 types.rsauto默认抓取后自动对 HTTP(S) 资源做分类由引擎决定按文档还是按页面处理document把 URI 当作单个远程文档/页面处理最贴合本文的 gzip 文档场景crawl以种子 URI 为起点爬取并提取发现的所有页面/文档。当mode为crawl时crawl子配置生效默认策略default_xberg_crawl_config见 types.rs为max_depth 1、max_pages 100、max_concurrent 10、respect_robots_txt true、stay_on_domain true、allow_subdomains true、soft_http_errors true、document_url_depth 1。对于 gzip 远程文档场景最省事的写法是仅设置mode document其余全部走默认值——这正是原文档片段和 e2e 测试的做法。四、测试验证mock 服务器与断言设计该场景对应的契约定义在 url_gzip_encoded_document.json它同时描述了 mock 服务器行为和验证断言Mock 响应模拟远端服务器{ 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. ... } ] }注意两点设计意图其一响应头显式携带content-encoding: gzip模拟真实压缩传输其二正文反复重复同一句话注释写明so the response is unambiguously compressed rather than stored——如果 mock 服务器没有真正压缩而是按原样存储重复内容也能保证压缩与否可被分辨避免测试误判。提取输入与配置{ input: { extract_input: { kind: uri, uri: $mock_url } }, config: { url: { mode: document } } }断言三条[ { type: not_error }, { type: contains, field: results[0].content, value: Remote document hello }, { type: equals, field: summary.remote_urls, value: 1 } ]not_error整个提取过程不得报错证明 gzip 传输编码被透明处理containsResults[0].Content必须包含解压后的明文Remote document hello证明抓取层成功把 gzip 响应还原成了可解析的文本equalsSummary.RemoteUrls 1证明本次调用只抓取了该文档一个远程 URL。这三条断言从无错误、内容正确、URL 统计正确三个维度锁定了该功能的行为其他语言的 e2e 测试Go、Python、Node、Ruby 等均以同一份 fixture 生成了等价用例。五、底层原理gzip 响应如何被还原与防御在 Xberg 核心实现中gzip 相关内容分布在两个层面1. MIME 类型注册application/gzip及其别名application/x-gzip在 mime.rs 中被注册为已知 MIME 类型。这意味着若远程文档本身就是.gz文件也会被识别并进入归档提取路径而本文讨论的传输编码场景则在抓取层完成解压二者是两条独立的路径。2. 归档解压与解压炸弹防护gzip.rs 实现了带上限的 gzip 解压decompress_gzip_limited(bytes, max_size)以SecurityLimits.max_archive_size为上限解压结果一旦超限立即报错Gzip decompressed size exceeds ... byte limit从实现层面防止解压炸弹。同时支持单次解压同时产出元数据与文本内容extract_gzip避免重复解压的开销。对应测试见 gzip_and_limits.rstest_decompress_gzip压缩 test content 后解压还原验证了基础解压路径。3. 抓取层的透明解压从 fixture 与 e2e 测试可以推断URL 抓取层在拿到带Content-Encoding: gzip的响应后会先还原出原始文档字节再交给后续 MIME 判定与格式解析因此上层调用者感知不到压缩过程。这种传输编码透明化的设计是 Xberg 能以统一ExtractAsync接口同时处理明文文档、压缩传输文档乃至归档文件的根基。六、延伸从单文档到批处理同一套 URL 配置也适用于批量提取。仓库的 URL 分类下还有url_batch_mixed_inputs场景url_batch_mixed_inputs.md演示ExtractBatchAsync在同一输出信封中混合处理字节输入与 URL 输入若需要抓取站点下的多个页面则切换mode为crawl并配合max_depth、max_pages等抓取参数。所有场景共享同一份UrlExtractionConfig这也是该配置被设计为独立结构体、并在ExtractionConfig中以url字段挂载的原因见 core.rs。总而言之处理 gzip 编码的远程文档时你只需构造kind uri的输入并设置url.mode document解压与解析交给引擎完成再通过Results[0].Content与Summary.RemoteUrls校验结果即可——这也是 Xberg 在 C# 及全部语言绑定中统一提供的契约。赞分享后端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 C 绑定实战通过 FFI 提取 gzip 压缩传输的远程文档Xberg C 绑定实战通过 FFI 提取 gzip 压缩传输的远程文档 本文围绕仓库中自动生成的 C 语言示例 url_gzip_encoded_docum后端AI 应用NLPXberg C FFI 实战用 xberg_extract 从远程 URL 提取文本文档Xberg C FFI 实战用 xberg_extract 从远程 URL 提取文本文档 本文以 Xberg 仓库中自动生成的 C 语言 E2E 片段 url后端AI 应用NLP用 Xberg C 绑定批量提取远程文档ExtractBatchAsync 与 extract_batch 契约实战用 Xberg C 绑定批量提取远程文档ExtractBatchAsync 与 extract_batch 契约实战 Xberg 是一套以 Rust 为核心的后端AI 应用NLP创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表