使用JSoup从网站源码提取JavaScript代码的技术问询及示例数据
使用JSoup提取网页中的Schema结构化JavaScript数据
嘿,我来帮你搞定用JSoup提取这段Schema产品数据的事儿!其实步骤很清晰,咱们一步步来:
1. 用JSoup定位目标script标签
首先,你得先获取网页的HTML文档,然后找到包含Schema Product数据的那个<script>标签。如果网页里的这个script标签有type="application/ld+json"属性(大部分正规网站都会加),那直接用选择器就能精准定位;如果没有,就通过内容里的特征(比如包含"@type": "Product")来筛选。
示例代码:
// 导入必要的JSoup包 import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; // 假设你已经拿到了网页的HTML源码(或者直接从URL加载) String html = "你的网页源码字符串"; Document doc = Jsoup.parse(html); // 优先通过type属性定位,更准确 Element schemaScript = doc.selectFirst("script[type='application/ld+json']"); // 如果没有type属性,就遍历所有script找包含Product特征的 if (schemaScript == null) { for (Element script : doc.select("script")) { String content = script.html(); if (content.contains("\"@type\": \"Product\"")) { schemaScript = script; break; } } }
2. 提取内容并解析成JSON
找到目标script后,把里面的文本内容取出来,因为这是JSON-LD格式的结构化数据,咱们需要用JSON解析库(比如Java自带的org.json或者Gson)来解析它,这样就能轻松提取需要的字段了。
示例代码:
import org.json.JSONObject; import org.json.JSONException; if (schemaScript != null) { String rawJsonContent = schemaScript.html(); // 处理可能的格式问题(比如你提供的内容开头多了个引号,先清理) rawJsonContent = rawJsonContent.replaceFirst("^\"", ""); try { // 把字符串转成JSON对象 JSONObject productObj = new JSONObject(rawJsonContent); // 提取你需要的字段 String productName = productObj.getString("name"); String description = productObj.getString("description"); JSONObject offers = productObj.getJSONObject("offers"); String price = offers.getString("price"); String currency = offers.getString("priceCurrency"); // 打印看看结果 System.out.println("产品名称:" + productName); System.out.println("售价:" + price + " " + currency); System.out.println("产品描述:" + description); } catch (JSONException e) { // 处理JSON解析错误(比如内容截断、格式不合法) e.printStackTrace(); System.out.println("JSON格式有问题,可能需要先修复内容"); } } else { System.out.println("没找到包含Product Schema的script标签"); }
一些小提示
- 如果网页里的JSON内容有转义字符(比如
\"),JSoup提取的时候会保留原始文本,JSON解析库能正常处理这类转义。 - 你提供的示例内容最后是截断的(
"GeoCoord..."),实际解析时得确保拿到完整的JSON字符串,否则会抛出解析异常,遇到这种情况可以先检查内容是否完整,或者用轻量的JSON修复工具预处理。
内容的提问来源于stack exchange,提问作者Edward
相关产品推荐
相关产品推荐

