You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java如何提取CDATA标签间的JSON-LD结构化数据内容

Java提取CDATA包裹的JSON-LD内容实现方案
  • 根因说明:调用charAt()无法获取有效字符,是因为抓取到的原始内容包含HTML转义实体(例如"是HTML规范下的双引号转义序列,并非字面量双引号),直接按字符索引定位会因为转义序列的长度偏差,无法匹配到预期的字符位置。
  • 实现流程:
    1. 对原始抓取内容做HTML实体反转义,将"/</>/&这类常见转义实体还原为对应原始字符。
    2. 通过正则匹配//<![CDATA[和//]]>两个标记的中间区间,开启单行匹配模式兼容带换行、缩进的JSON内容,提取纯JSON片段。
    3. 裁剪提取到的JSON片段前后的空白、换行符;如果需要得到双引号转义的目标格式字符串,将JSON内部的双引号替换为\"后,在整个字符串前后包裹双引号即可。

可直接运行的参考代码:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class CdataJsonExtractor {
    public static void main(String[] args) {
        // 替换为你实际抓取到的原始字符串
        String rawCaptureContent = "//<![CDATA[\n{&quot;@type&quot;:&quot;Product&quot;, &quot;@context&quot;: &quot;https://schema.org&quot;,\"name\":\"测试商品\"}\n//]]>";

        // 1. 反转义HTML实体
        String unescapedContent = rawCaptureContent
                .replace("&quot;", "\"")
                .replace("&lt;", "<")
                .replace("&gt;", ">")
                .replace("&amp;", "&");

        // 2. 正则提取CDATA包裹的内容,DOTALL模式让.匹配换行符
        Pattern cdataPattern = Pattern.compile("//<!\\[CDATA\\[(.*?)//]]>", Pattern.DOTALL);
        Matcher matcher = cdataPattern.matcher(unescapedContent);
        String pureJson = "";
        if (matcher.find()) {
            pureJson = matcher.group(1).trim();
        }

        // 3. 生成带双引号转义的目标字符串
        String targetEscapedStr = "\"" + pureJson.replace("\"", "\\\"") + "\"";

        // 结果验证
        System.out.println("提取到的纯JSON内容:" + pureJson);
        System.out.println("转义后的目标字符串:" + targetEscapedStr);
    }
}

注意:如果抓取的页面包含更复杂的HTML转义实体,不要手动枚举替换规则,可使用HTML解析工具类做统一反转义,避免漏处理特殊字符导致JSON解析失败。如果后续需要操作JSON字段,可直接将提取到的pureJson传入JSON解析库反序列化为对象,不需要额外做字符串转义。

内容的提问来源于stack exchange,提问作者Cassie Nguyen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 00:33:32