如何用PHP Simple HTML DOM获取指定Basic EPS行的TD值
解决Simple HTML DOM提取第二组Basic EPS数值的问题
我来帮你搞定这个问题!你的核心需求是抓取第二组Basic EPS对应的数值(也就是EPS After Extra Ordinary标题下方的那一行),现在代码重复获取是因为没有精准定位到目标行,逻辑也有点混乱。下面给你两种靠谱的解决方案:
方案一:直接定位第二个Basic EPS元素
利用Simple HTML DOM的选择器找到所有文本为Basic EPS的td元素,直接取第二个(数组索引为1,因为从0开始计数),再提取它所在行的数值:
// 找到所有包含"Basic EPS"的td.det元素 $basicEpsTds = $html->find('td.det:contains("Basic EPS")'); // 检查是否存在第二组Basic EPS if (isset($basicEpsTds[1])) { // 获取第二个Basic EPS所在的<tr>行 $targetRow = $basicEpsTds[1]->parent(); // 遍历该行的td,跳过第一个"Basic EPS"的单元格,提取数值 $epsValues = []; foreach ($targetRow->find('td.det') as $index => $td) { if ($index > 0) { // 跳过第一个td(文本是Basic EPS) $epsValues[] = $td->plaintext; echo $td->plaintext . "<br>"; } } // 最终$epsValues数组存储了你需要的所有数值:[0.82, 1.05, 0.74, 1.00, 0.96] } else { echo "未找到第二组Basic EPS数据"; }
方案二:基于语义标题定位(更稳定)
如果页面结构可能变化,推荐依赖EPS After Extra Ordinary这个标题来定位后续的Basic EPS行,这种方法更贴合页面的语义结构,容错性更强:
// 找到"EPS After Extra Ordinary"标题所在的td元素 $epsAfterTitle = $html->find('td.detb:contains("EPS After Extra Ordinary")', 0); if ($epsAfterTitle) { // 获取标题所在的<tr>,再取它的下一个兄弟<tr>(就是第二组Basic EPS的行) $targetRow = $epsAfterTitle->parent()->next_sibling(); if ($targetRow) { // 提取该行的数值单元格 $epsValues = []; foreach ($targetRow->find('td.det') as $index => $td) { if ($index > 0) { $epsValues[] = $td->plaintext; echo $td->plaintext . "<br>"; } } } else { echo "EPS After Extra Ordinary标题后未找到Basic EPS行"; } } else { echo "未找到EPS After Extra Ordinary标题"; }
为什么你的原代码会重复获取?
原代码的逻辑存在嵌套遍历和判断的混乱:先找到所有td.det,然后判断文本是否为Basic EPS,又嵌套foreach遍历$mn[1],导致两次匹配到Basic EPS元素时都执行了提取逻辑,所以会重复输出。上面的两种方案都精准定位到了第二组目标行,不会出现重复问题。
内容的提问来源于stack exchange,提问作者Rajesh Kumar Bihani
相关产品推荐
相关产品推荐

