如何使用Goutte筛选仅含@type:"Product"的JSON-LD数据?
如何在Goutte中筛选@type为"Product"的JSON-LD条目?
当然可以!你只需要在遍历JSON-LD节点的流程里,先把节点内的JSON内容解析成PHP数组,再检查@type字段是否匹配"Product",之后再执行后续处理逻辑就行。
下面是修改后的完整代码示例:
$client = new Client(); $url = "https://www.xxxx.com"; $crawler = $client->request('GET', $url); $crawler->filterXPath('//*[@type="application/ld+json"]')->each(function ($node) { // 提取节点内的JSON文本并解析为关联数组 $jsonLd = json_decode($node->text(), true); // 处理JSON解析失败的情况 if (json_last_error() !== JSON_ERROR_NONE) { return; // 解析失败直接跳过当前节点 } // 处理单个对象格式的JSON-LD if (isset($jsonLd['@type']) && $jsonLd['@type'] === 'Product') { // 在这里执行你的后续处理逻辑 var_dump($jsonLd); } // 处理数组格式的JSON-LD(包含多个条目) if (is_array($jsonLd)) { foreach ($jsonLd as $item) { if (isset($item['@type']) && $item['@type'] === 'Product') { // 在这里执行你的后续处理逻辑 var_dump($item); } } } });
关键细节说明:
- 解析JSON文本:用
json_decode($node->text(), true)将节点内的JSON字符串转成PHP关联数组,方便后续字段判断。 - 错误防护:加入
json_last_error()检查,避免无效JSON导致脚本异常中断。 - 兼容两种结构:网页中的JSON-LD可能是单个对象,也可能是包含多个对象的数组,同时处理这两种情况能确保不会漏掉符合条件的条目。
这样就能精准锁定@type为Product的JSON-LD条目,只对这些内容执行后续操作啦。
内容的提问来源于stack exchange,提问作者Simon Andersen
相关产品推荐
相关产品推荐

