通过XPath提取mytuner-radio当前播放歌曲的歌手与歌名问题求助
问题排查与修正方案
原代码存在的核心问题
- 标签拼写错误:XPath中误将
span写成spam,导致无法匹配目标节点。 - XPath索引逻辑错误:XPath的节点索引从
1开始,原代码中用[0]会直接过滤掉所有节点;且表达式试图同时定位两个节点的写法逻辑混乱,无法正确匹配。 - 请求头缺失:直接使用
file_get_contents可能被网站反爬机制拦截,导致获取的网页内容不完整。
修正后的代码
<?php $dom = new DOMDocument(); libxml_use_internal_errors(true); // 添加模拟浏览器的请求头,避免被网站拦截 $context = stream_context_create([ 'http' => [ 'header' => 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' ] ]); $html = file_get_contents('https://mytuner-radio.com/pt/radio/radio-meo-music-414443/', false, $context); $dom->loadHTML($html); $xPath = new DOMXPath($dom); // 定位第一个history-song节点(对应"正在播放"板块) $currentSongNode = $xPath->query('//div[@class="history-song"]')->item(0); if ($currentSongNode) { // 在当前节点内查询歌曲名 $songName = $xPath->query('.//span[@class="song-name"]', $currentSongNode)->item(0)->textContent; // 在当前节点内查询歌手名 $artistName = $xPath->query('.//span[@class="song-artist"]', $currentSongNode)->item(0)->textContent; echo "正在播放:{$songName} - {$artistName}\n"; } else { echo "未找到正在播放的歌曲信息\n"; } ?>
关键修正说明
- 修正了
span的拼写错误,确保XPath能匹配到目标标签。 - 改用PHP的
item(0)获取DOMNodeList中的第一个节点(对应页面上"正在播放"的内容),替代XPath中错误的[0]索引。 - 添加User-Agent请求头,模拟浏览器请求,确保能完整获取网页内容。
- 先定位到"正在播放"的父节点,再在其内部查询歌曲名和歌手名,逻辑更清晰可靠。
内容的提问来源于stack exchange,提问作者Acruz
相关产品推荐
相关产品推荐

