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

WordPress中使用PHP+XPath获取指定DIV内多个itemprop值

问题根源

你的代码存在三个核心问题:

  1. 编写的XPath没有限定到第二个class="content"的DIV,默认会全局匹配所有content容器下的对应节点,不符合你要限定父容器的需求
  2. DOMXPath::query()返回值是DOMNodeList对象类型,不是字符串,直接echo必然触发报错,必须从匹配到的节点对象中读取nodeValue属性才能拿到文本内容
  3. 你只编写了匹配itemprop="name"节点的查询规则,自然无法获取description对应的内容。
实现方案

先精准定位目标父容器,再基于父容器做相对子节点查询,完全避免全局匹配到无关的itemprop节点,完整代码如下:

// 以下代码基于PHP原生DOM扩展实现,可直接在WordPress插件环境中运行
// 假设$html为你需要解析的HTML字符串
$dom = new DOMDocument();
// 屏蔽非规范HTML导致的解析警告
@$dom->loadHTML($html);
$xpath = new DOMXPath($dom);

// 定位第二个class=content的DIV,注意XPath索引从1开始计数
$target_parent = $xpath->query('//div[@class="content"][2]')->item(0);

$name = '';
$description = '';

// 校验父节点存在后再查询子节点,避免结构缺失导致报错
if ($target_parent instanceof DOMElement) {
    // 子节点查询XPath开头加. 表示基于当前父节点做相对查找,不会全局匹配
    $name_node = $xpath->query('.//h3[@itemprop="name"]', $target_parent)->item(0);
    if ($name_node instanceof DOMElement) {
        $name = trim($name_node->nodeValue);
    }

    $desc_node = $xpath->query('.//div[@itemprop="description"]', $target_parent)->item(0);
    if ($desc_node instanceof DOMElement) {
        $description = trim($desc_node->nodeValue);
    }
}

// 此时$name和$description就是你需要的独立变量,可直接调用

注意事项

  • 子节点查询的XPath必须以.开头,否则会默认从文档根节点全局查找,失去父节点的限定作用
  • 所有节点取值前都做类型校验,避免页面结构变动、目标节点不存在时触发致命错误
  • 如果页面中content类DIV可能存在多个类名(例如class="content highlight"),精确class匹配会失效,可以将父节点的XPath替换为//div[contains(concat(" ", normalize-space(@class), " "), " content ")][2]兼容多类名场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 13:09:16