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

如何使用Goutte获取type为application/ld+json的script元素内容

解决Goutte获取application/ld+json类型Script数据的问题

嘿,我懂你的困扰——用Goutte抓普通HTML元素顺手得很,但这种带特殊类型的script标签确实得换个筛选思路。别慌,几步就能搞定:

1. 精准定位目标Script元素

你之前用的是类选择器,现在要针对type属性来筛选,Goutte的DOM Crawler支持属性选择器,直接用script[type="application/ld+json"]就能锁定目标。

  • 如果页面只有一个这类标签,用first()获取第一个匹配元素;
  • 如果有多个,就用each()遍历处理。

2. 提取并解析JSON内容

找到标签后,用text()方法取出里面的JSON文本,再用json_decode()转成PHP关联数组(第二个参数设为true,方便后续字段操作)。这里记得加个错误判断,避免JSON格式异常导致程序卡壳。

3. 拆分处理目标数据

解析完成后,你就可以像操作普通数组一样,轻松取出name、@type这些需要的字段。

完整代码示例(单个Script标签场景)

use Goutte\Client;

// 初始化Goutte客户端并请求目标页面
$client = new Client();
$crawler = $client->request('GET', '你的目标页面URL');

// 定位到application/ld+json类型的script标签
$ldScript = $crawler->filter('script[type="application/ld+json"]')->first();

// 提取标签内的JSON文本
$ldJsonText = $ldScript->text();

// 解析JSON为关联数组
$ldJsonData = json_decode($ldJsonText, true);

// 检查JSON解析是否成功
if (json_last_error() !== JSON_ERROR_NONE) {
    die('JSON解析失败:' . json_last_error_msg());
}

// 处理并输出需要的数据
$businessName = $ldJsonData['name'];
$businessType = $ldJsonData['@type'];
$schemaContext = $ldJsonData['@context'];

echo "商家名称:{$businessName}\n";
echo "商家类型:{$businessType}\n";
echo "Schema上下文:{$schemaContext}\n";

处理多个同类型Script标签的场景

如果页面存在多个application/ld+json标签,用each()遍历即可:

$crawler->filter('script[type="application/ld+json"]')->each(function ($node) {
    $jsonText = $node->text();
    $jsonData = json_decode($jsonText, true);
    
    // 跳过解析失败的无效数据
    if (!$jsonData || json_last_error() !== JSON_ERROR_NONE) {
        return;
    }
    
    // 处理每个有效JSON数据
    if (isset($jsonData['name'])) {
        echo "找到商家:{$jsonData['name']}\n";
    }
});

这样就能轻松获取并处理你需要的Schema.org结构化数据啦~

内容的提问来源于stack exchange,提问作者Matt Hutchings

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:11:40