PHP代码无法捕获服务器名称数组,请求排查问题
问题描述
我需要提取class为server的<li>元素下的<span class="label">中的服务器名称(从ADLIVECYCES2-P1到lhewbawas01)并存入数组。目标HTML片段如下:
<span class="label">ITCAM for AD/WebSphere/J2EE</span> (26) <ul> <li class="server"><span class="label">ADLIVECYCES2-P1</span></li> <li class="server"><span class="label">ADLIVECYCES2-P2</span></li> <li class="server"><span class="label">J168-L168</span></li> <li class="server"><span class="label">WAS linux webapplication</span></li> <li class="server"><span class="label">WAS linux webservice</span></li> <li class="server"><span class="label">WAS windows Adobe2</span></li> <li class="server"><span class="label">WASzos linux webservice</span></li> <li class="server"><span class="label">lhewbawas01</span></li> </ul> </li> <li class="callerType">
我编写了如下PHP代码,但运行后$resultarray变量为空,请问代码哪里有问题?
<?php include('C:\Manutenzione\Analisi_TT\simple_html_dom.php'); $ip_soatt04='myIP'; $usr_soatt = 'root'; $pwd_soatt = 'mypwd'; $dom = new DomDocument(); $connection_soatt04 = ssh2_connect($ip_soatt04, 22); if (!$connection_soatt04) { echo "impossibile connettersi a soatt04"; } ssh2_auth_password($connection_soatt04, $usr_soatt , $pwd_soatt); $stream = ssh2_exec($connection_soatt04,'cat /opt/sw/db_viewer/todata_summary.html'); stream_set_blocking($stream, true); $stream_out=stream_get_contents($stream); $dom->loadHTML($stream_out); $xpath = new DOMXpath($dom); $heading=parseToArray($xpath,'server'); function parseToArray($xpath,$class) { $xpathquery="//li[@class='".$class."']/span"; $elements = $xpath->query($xpathquery); if (!is_null($elements)) { $resultarray=array(); foreach ($elements as $element) { $nodes = $element->childNodes; foreach ($nodes as $node) { $resultarray[] = $node->nodeValue; } } return $resultarray; } } ?>
问题分析与修复
你的代码存在以下几个关键问题:
XPath查询精度不足
原XPath仅匹配server类<li>下的所有<span>,但目标<span>还有label类属性。实际页面中可能存在其他无label类的<span>干扰,或DOM解析后结构差异导致匹配失败。应将查询条件细化:$xpathquery = "//li[@class='".$class."']/span[@class='label']";HTML解析错误未处理
DomDocument::loadHTML()对不规范HTML会静默忽略错误,可能导致DOM结构解析异常。需添加错误抑制和清理:libxml_use_internal_errors(true); // 禁用libxml错误输出 $dom->loadHTML($stream_out); libxml_clear_errors(); // 清除解析错误文本获取逻辑冗余
遍历childNodes获取文本是多余的,直接调用$element->nodeValue即可拿到<span>的完整文本,还可通过trim()去除多余空格:foreach ($elements as $element) { $resultarray[] = trim($element->nodeValue); }边界情况未处理
当无匹配元素时,原函数未返回明确值,会默认返回null。需确保函数始终返回数组:return $resultarray ?? [];
修复后的完整代码
<?php include('C:\Manutenzione\Analisi_TT\simple_html_dom.php'); $ip_soatt04 = 'myIP'; $usr_soatt = 'root'; $pwd_soatt = 'mypwd'; $dom = new DomDocument(); $connection_soatt04 = ssh2_connect($ip_soatt04, 22); if (!$connection_soatt04) { echo "impossibile connettersi a soatt04"; exit; // 连接失败直接终止后续执行 } ssh2_auth_password($connection_soatt04, $usr_soatt, $pwd_soatt); $stream = ssh2_exec($connection_soatt04, 'cat /opt/sw/db_viewer/todata_summary.html'); stream_set_blocking($stream, true); $stream_out = stream_get_contents($stream); // 处理不规范HTML的解析错误 libxml_use_internal_errors(true); $dom->loadHTML($stream_out); libxml_clear_errors(); $xpath = new DOMXpath($dom); $heading = parseToArray($xpath, 'server'); // 打印结果用于测试 print_r($heading); function parseToArray($xpath, $class) { $xpathquery = "//li[@class='".$class."']/span[@class='label']"; $elements = $xpath->query($xpathquery); $resultarray = []; if ($elements->length > 0) { // 检查是否有匹配元素 foreach ($elements as $element) { $resultarray[] = trim($element->nodeValue); } } return $resultarray; } ?>
内容的提问来源于stack exchange,提问作者Fabio
相关产品推荐
相关产品推荐

