WordPress中使用PHP+XPath获取指定DIV内多个itemprop值
问题根源
你的代码存在三个核心问题:
- 编写的XPath没有限定到第二个
class="content"的DIV,默认会全局匹配所有content容器下的对应节点,不符合你要限定父容器的需求 DOMXPath::query()返回值是DOMNodeList对象类型,不是字符串,直接echo必然触发报错,必须从匹配到的节点对象中读取nodeValue属性才能拿到文本内容- 你只编写了匹配
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
相关产品推荐
相关产品推荐

