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

如何在Simple HTML Dom中嵌套find循环?遇非对象属性报错

解决Simple HTML Dom嵌套find循环中的PHP Notice错误

嘿,这个坑我之前也踩过!咱们先把问题根源理清楚:

你代码里的$li->find('span')返回的是匹配到的span元素数组,不是单个对象。直接对数组调用->innertext属性,PHP肯定会抛出「Trying to get property of non-object」的警告——数组根本没有这个属性啊!而且如果某个<li>标签里压根没有<span>,find('span')会返回空数组,这时候访问属性就更会报错了。

给你两种解决方案,看你的实际需求选:

情况1:每个
  • 里只有一个
  • 如果你的场景是每个列表项最多对应一个span,那可以用find()的第二个参数指定索引,获取单个元素,并且先判断元素是否存在:

    // 获取HTML内容
    $html = file_get_html('<url>'); 
    // 遍历body元素(其实这里可以直接跳过body,find('li')会全局查找,不过保留你的原有逻辑)
    foreach($html->find('body') as $body){ 
        // 获取所有li元素
        $lis = $body->find('li'); 
        foreach($lis as $li){ 
            // 获取当前li下的第一个span元素,第二个参数0表示取第一个匹配项
            $targetSpan = $li->find('span', 0);
            // 先检查span是否存在,再输出内容
            if ($targetSpan) {
                echo $targetSpan->innertext; 
            }
        }
    }
    

    情况2:每个
  • 里有多个
  • 如果需要遍历每个li里的所有span,那就再套一层foreach循环遍历span数组:

    // 获取HTML内容
    $html = file_get_html('<url>'); 
    foreach($html->find('body') as $body){ 
        $lis = $body->find('li'); 
        foreach($lis as $li){ 
            // 获取当前li下的所有span数组
            $spans = $li->find('span');
            // 遍历每个span输出内容
            foreach($spans as $span){
                echo $span->innertext;
            }
        }
    }
    

    最后补个Simple HTML Dom的find()方法小知识点:

    • 只传选择器:返回匹配元素的数组(找不到则为空数组)
    • 传选择器+索引:返回对应位置的单个元素对象(找不到则返回false/null)

    这样修改后,那个烦人的警告就消失啦!

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

    相关产品推荐
    方舟 Agent Plan

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

    最近更新时间:2026.05.15 04:20:14