PHP提取指定DIV下UL的LI报错:调用getElementsByTagName()触发数组错误
解决PHP提取指定div下列表项的问题
首先,咱们来分析你遇到的报错原因:$dom->find('.skaties-starfm-songs-column') 方法返回的是匹配到的元素数组(因为页面有3个符合类名的div),而你尝试直接对这个数组调用getElementsByTagName()——这显然不行,因为数组没有这个DOM元素的方法,所以才会抛出Call to a member function getElementsByTagName() on array的致命错误。
你的第二段代码能正常输出所有div内容,是因为你正确遍历了find返回的数组,但没有筛选到第一个div下的ul列表项。下面是针对你的需求的正确实现方案:
正确代码示例
<?php include_once 'includes/db.inc.php'; include_once 'includes/simple_html_dom.php'; include_once 'includes/curl_init.php'; // 获取页面HTML内容 $html = curl_get('https://skaties.lv/starfm/dziesmu-top/'); // 初始化simple_html_dom对象 $dom = str_get_html($html); // 1. 获取第一个匹配的.skaties-starfm-songs-column元素 // find方法第二个参数传0,表示只取第一个匹配项(返回单个元素而非数组) $firstSongColumn = $dom->find('.skaties-starfm-songs-column', 0); if ($firstSongColumn) { // 2. 在第一个列元素内,查找所有ul下的li标签 $songItems = $firstSongColumn->find('ul li'); // 3. 遍历输出每个li的内容 foreach ($songItems as $item) { // 如果你需要纯文本内容,用plaintext属性;要保留HTML结构直接echo $item即可 echo $item->plaintext . '<br>'; } } else { echo '未找到目标列元素,请检查页面结构是否变更'; } // 记得清理DOM对象释放内存 $dom->clear(); ?>
关键知识点说明
simple_html_dom的find()方法:当只传选择器参数时,返回所有匹配元素的数组;如果第二个参数传入索引值(比如0),则返回对应位置的单个元素。- 要精准定位元素,需要逐层筛选:先拿到目标父元素(第一个div),再在其内部查找子元素(ul下的li),避免一次性匹配到所有div下的li。
- 操作完成后调用
$dom->clear()可以释放内存,避免内存泄漏问题。
内容的提问来源于stack exchange,提问作者Harijs Vahrusevs
相关产品推荐
相关产品推荐

