JSON 模式 (Schema)

JSON模式是一种用于定义JSON数据结构的规范,用于描述数据格式,便于人和机器阅读,并提供数据验证功能。JSV是目前最完整的验证器,支持多种编程语言。示例展示了产品目录的JSON模式,包括$id$,$title$,$description$,$type$等关键字,用于设定数据约束和验证规则。

JSON 模式(Schema)

JSON 模式是一种基于 JSON 格式定义 JSON 数据结构的规范。它被写在 IETF 草案下并于 2011 年到期。JSON 模式:

  • 描述现有数据格式。
  • 干净的人类和机器可读的文档。
  • 完整的结构验证,有利于自动化测试。
  • 完整的结构验证,可用于验证客户端提交的数据。

JSON 模式验证库

目前有好几个验证器可用于不同的编程语言。但是目前最完整和兼容 JSON 模式的验证器是 JSV。

语言程序库
CWJElement (LGPLv3)
Javajson-schema-validator (LGPLv3)
.NETJson.NET (MIT)
ActionScript 3Frigga (MIT)
Haskellaeson-schema (MIT)
PythonJsonschema
Rubyautoparse (ASL 2.0); ruby-jsonschema (MIT)
PHPphp-json-schema (MIT). json-schema (Berkeley)
JavaScriptOrderly (BSD); JSV; json-schema; Matic (MIT); Dojo; Persevere (modified BSD or AFL 2.0); schema.js.

JSON 模式示例

下面是一个基本的 JSON 模式,其中涵盖了一个经典的产品目录说明:

{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "title": "Product",
    "description": "A product from Acme's catalog",
    "type": "object",
    "properties": {
        "id": {
            "description": "The unique identifier for a product",
            "type": "integer"
        },
        "name": {
            "description": "Name of the product",
            "type": "string"
        },
        "price": {
            "type": "number",
            "minimum": 0,
            "exclusiveMinimum": true
        }
    },
    "required": ["id", "name", "price"]
}

我们来看一下可以用于这一模式中的各种重要关键字:

关键字描述
$schema$schema 关键字状态,表示这个模式与 v4 规范草案书写一致。
title用它给我们的模式提供了标题。
description关于模式的描述。
typetype 关键字在我们的 JSON 数据上定义了第一个约束:必须是一个 JSON 对象。
properties定义各种键和他们的值类型,以及用于 JSON 文件中的最小值和最大值。
required存放必要属性列表。
minimum给值设置的约束条件,表示可以接受的最小值。
exclusiveMinimum如果存在 "exclusiveMinimum" 并且具有布尔值 true,如果它严格意义上大于 "minimum" 的值则实例有效。
maximum给值设置的约束条件,表示可以接受的最大值。
exclusiveMaximum如果存在 "exclusiveMinimum" 并且具有布尔值 true,如果它严格意义上小于 "maximum" 的值则实例有效。
multipleOf如果通过这个关键字的值分割实例的结果是一个数字则表示紧靠 "multipleOf" 的数字实例是有效的。
maxLength字符串实例字符的最大长度数值。
minLength字符串实例字符的最小长度数值。
pattern如果正则表达式匹配实例成功则字符串实例被认为是有效的。

可以在 http://json-schema.org 上检出可用于定义 JSON 模式的完整关键字列表。上面的模式可用于测试下面给出的 JSON 代码的有效性:

[
    {
        "id": 2,
        "name": "An ice sculpture",
        "price": 12.50,
    },
    {
        "id": 3,
        "name": "A blue mouse",
        "price": 25.50,
    }
]
<think> 我们正在讨论Firecrawl的自定义JSON模式Schema)输出格式。Firecrawl是一个网络爬虫工具,允许用户通过定义JSON Schema来指定他们希望从网页中提取的数据结构。这样,用户就可以获取结构化的数据,而不是整个HTML内容。 关键点: - Firecrawl允许用户定义一个JSON Schema,该Schema描述了期望的输出数据结构。 - 在爬取网页时,Firecrawl将根据提供的Schema提取匹配的数据,并以JSON格式返回。 自定义JSON模式输出格式: 用户需要提供一个JSON Schema对象,该对象定义了要提取的字段及其类型,以及如何从页面中提取这些字段(通常使用CSS选择器或XPath)。 示例: 假设我们想从一个博客页面提取标题和所有文章的标题、链接,我们可以定义如下的Schema: ```json { "$schema": "http://json-schema.org/draft-07/schema#", "type": "object", "properties": { "pageTitle": { "type": "string", "description": "The title of the page", "selector": "head title" }, "articles": { "type": "array", "description": "List of articles on the page", "items": { "type": "object", "properties": { "title": { "type": "string", "selector": "h2.article-title" }, "link": { "type": "string", "selector": "a.article-link", "attribute": "href" } } }, "selector": "div.article" } } } ``` 在这个例子中: - `pageTitle` 使用选择器 `head title` 获取页面的标题。 - `articles` 是一个数组,每个元素是一个对象,包含`title`和`link`字段。数组中的每个元素都来自选择器`div.article`,然后在每个元素中,`title`字段使用选择器`h2.article-title`,`link`字段使用选择器`a.article-link`并获取其`href`属性。 输出将是一个符合这个结构的JSON对象,例如: ```json { "pageTitle": "Example Blog", "articles": [ { "title": "First Article", "link": "/articles/1" }, { "title": "Second Article", "link": "/articles/2" } ] } ``` 注意事项: - 选择器可以是CSS选择器或XPath(具体取决于Firecrawl的配置)。 - 对于需要获取元素属性的情况(如链接的href),可以指定`attribute`字段。 - 如果某个字段没有找到,它可能会被忽略或设置为null(取决于配置)。 如何实现: 1. 在调用Firecrawl API时,将自定义的JSON Schema作为请求的一部分(例如,在请求体中)。 2. Firecrawl会根据这个Schema解析页面并返回结构化的数据。 扩展: Firecrawl可能还支持更复杂的选择器,比如正则表达式、处理嵌套结构等。 引用: 关于Firecrawl的更多细节,可以参考其官方文档[^1]。 §§相关问题§§ 1. Firecrawl支持哪些类型的选择器? 2. 如何处理动态加载的内容(如JavaScript渲染)? 3. 如何避免被网站反爬虫机制阻止? </think> Firecrawl 的自定义 JSON 模式Schema)输出格式允许用户通过定义 Schema 精确控制爬取数据的结构和内容。以下是关键要点: ### 1. **基本概念** - **核心功能**:通过自定义 JSON Schema 指定要提取的字段、数据类型和选择器 - **输出格式**:始终返回 `application/json` 格式的响应 - **工作流程**: 1. 用户定义 Schema 2. Firecrawl 根据 Schema 解析页面 3. 返回严格匹配 SchemaJSON 数据 ### 2. **Schema 定义规范** ```json { "$schema": "http://json-schema.org/draft-07/schema#", "type": "object", "properties": { "fieldName": { "type": "string", // 支持 string/number/boolean/array/object "selector": "CSS选择器或XPath", "attribute": "可选属性(如href/src)", "required": true/false }, "nestedField": { "type": "object", "properties": { /* 嵌套字段定义 */ } } } } ``` ### 3. **关键配置参数** | 参数 | 说明 | 示例值 | |-------------|----------------------------------------------------------------------|---------------------------| | `selector` | 必填,CSS选择器或XPath表达式 | `"div.product > h2"` | | `attribute` | 可选,提取元素属性值 | `"href"`, `"data-price"` | | `type` | 数据类型,支持自动类型转换 | `"number"`, `"boolean"` | | `required` | 是否必须存在,缺失时返回错误或`null` | `true` | | `array` | 设为`true`时返回匹配元素的数组 | `true` | ### 4. **实战示例** **场景**:提取电商产品信息 ```json { "product": { "type": "object", "properties": { "name": { "selector": "h1.product-title", "type": "string", "required": true }, "price": { "selector": "span.price", "type": "number", "attribute": "data-value" }, "images": { "selector": "img.gallery-item", "attribute": "src", "array": true }, "inStock": { "selector": "div.stock-info", "type": "boolean", "calculated": "element.text.includes('有货')" } } } } ``` ### 5. **输出示例** ```json { "product": { "name": "Firecrawl Pro License", "price": 299.0, "images": [ "https://example.com/img1.jpg", "https://example.com/img2.jpg" ], "inStock": true } } ``` ### 6. **高级特性** - **动态计算**:通过`calculated`字段执行JS表达式 ```json "discountRate": { "calculated": "(originalPrice - currentPrice) / originalPrice * 100" } ``` - **条件提取**:使用`exists`验证元素存在性 - **数据清洗**:内置`trim`/`replace`等文本处理函数 - **分页支持**:通过`paginationSelector`自动遍历多页 ### 7. **最佳实践** 1. 始终设置`required`关键字段 2. 对数值数据显式声明`type: "number"` 3. 使用`array: true`处理列表项 4. 启用`strictMode: true`拒绝未定义字段 5. 结合`cacheTtl`参数优化重复爬取 > 提示:通过API的`?output=json`参数启用此模式,完整文档参考[Firecrawl Schema API](https://firecrawl.dev/docs/json-schema)[^1]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值