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

如何使用DomDocument获取指定class的span标签内的文本内容

解决方法

你当前的代码已经通过DomXPath查询获取到了所有匹配的span节点集合(DOMNodeList对象),调整后即可拿到第一个节点的文本内容,具体有两种实现方式:

方式1:直接从查询结果中取第一个节点

DOMNodeList对象可以通过item(0)获取第一个匹配节点,访问其nodeValue属性即可得到节点内的纯文本:

$dom = new domDocument;
// 屏蔽载入警告的同时加判断避免后续操作报错
if (@$dom->loadHTML($url)) {
    $classname = "test";
    $finder = new DomXPath($dom);
    $spaner = $finder->query("//span[contains(@class, '$classname')]");
    // 先判断是否存在匹配节点,避免调用item(0)时报错
    if ($spaner->length > 0) {
        // 获取第一个节点的文本内容
        $targetText = $spaner->item(0)->nodeValue;
        echo $targetText; // 输出结果就是hello world
    }
}

方式2:在XPath语句中直接限定取第一个节点

XPath的下标从1开始计数,可以直接在查询路径末尾加[1]直接获取第一个匹配节点,减少后续判断逻辑:

$dom = new domDocument;
if (@$dom->loadHTML($url)) {
    $classname = "test";
    $finder = new DomXPath($dom);
    // 末尾加[1]直接取第一个匹配节点
    $targetSpan = $finder->query("//span[contains(@class, '$classname')][1]");
    if ($targetSpan->length > 0) {
        $targetText = $targetSpan->item(0)->nodeValue;
    }
}

注意事项

你当前使用的contains(@class, '$classname')写法存在误匹配风险:如果存在<span class="test2">这类元素也会被匹配到。要精准匹配独立class,建议使用优化后的XPath语句:

//span[contains(concat(' ', normalize-space(@class), ' '), ' $classname ')]

该写法会先把class属性的前后空格去掉,再在前后拼接空格后判断是否包含独立的类名,避免误匹配。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 17:06:05