Java如何提取CDATA标签间的JSON-LD结构化数据内容
Java提取CDATA包裹的JSON-LD内容实现方案
- 根因说明:调用
charAt()无法获取有效字符,是因为抓取到的原始内容包含HTML转义实体(例如"是HTML规范下的双引号转义序列,并非字面量双引号),直接按字符索引定位会因为转义序列的长度偏差,无法匹配到预期的字符位置。 - 实现流程:
- 对原始抓取内容做HTML实体反转义,将
"/</>/&这类常见转义实体还原为对应原始字符。 - 通过正则匹配
//<![CDATA[和//]]>两个标记的中间区间,开启单行匹配模式兼容带换行、缩进的JSON内容,提取纯JSON片段。 - 裁剪提取到的JSON片段前后的空白、换行符;如果需要得到双引号转义的目标格式字符串,将JSON内部的双引号替换为
\"后,在整个字符串前后包裹双引号即可。
- 对原始抓取内容做HTML实体反转义,将
可直接运行的参考代码:
import java.util.regex.Matcher; import java.util.regex.Pattern; public class CdataJsonExtractor { public static void main(String[] args) { // 替换为你实际抓取到的原始字符串 String rawCaptureContent = "//<![CDATA[\n{"@type":"Product", "@context": "https://schema.org",\"name\":\"测试商品\"}\n//]]>"; // 1. 反转义HTML实体 String unescapedContent = rawCaptureContent .replace(""", "\"") .replace("<", "<") .replace(">", ">") .replace("&", "&"); // 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
相关产品推荐
相关产品推荐

