如何在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
相关产品推荐
相关产品推荐

