如何在CSS或PHP Goutte库中选中HTML表格相邻tr标签提取对应数据
实现方案
Goutte底层依赖Symfony Crawler组件,自带相邻节点筛选方法,不需要纯CSS选择器就能快速匹配对应学科行,以下是两种可行实现:
方案1:从考试行向上匹配所属学科
遍历每一条考试记录行时,直接筛选该行之前最近的学科行即可,代码如下:
$crawler->filter('.toggle4')->each(function($node) { // 获取当前考试对应的最近的所属学科行 $matterRow = $node->previousAll('.notes_bulletin_row_mod')->first(); // 提取学科名称,可根据实际表格的td位置调整nth-child的索引 $matterName = trim($matterRow->filter('td:nth-child(2)')->text()); // 提取考试名称和分数 $testName = trim($node->filter('td:nth-child(4)')->text()); $note = trim($node->filter('td:nth-child(5)')->text()); // 按要求格式输出 echo "-----------------------------------".PHP_EOL; echo "Matter : ".$matterName.PHP_EOL; echo "Test name : ".$testName.PHP_EOL; echo "Note : ".$note.PHP_EOL; echo "-----------------------------------".PHP_EOL.PHP_EOL; });
方案2:从学科行向下匹配所有对应考试(更稳定)
优先遍历所有学科行,再匹配该学科行到下一个学科行之间的所有考试记录,适配一个学科下有多场考试的场景,不会出现匹配错位问题:
$crawler->filter('.notes_bulletin_row_mod')->each(function($matterNode) { $matterName = trim($matterNode->filter('td:nth-child(2)')->text()); // 筛选当前学科之后、下一个学科之前的所有考试行 $testRows = $matterNode->nextUntil('.notes_bulletin_row_mod', '.toggle4'); $testRows->each(function($testNode) use ($matterName) { $testName = trim($testNode->filter('td:nth-child(4)')->text()); $note = trim($testNode->filter('td:nth-child(5)')->text()); echo "-----------------------------------".PHP_EOL; echo "Matter : ".$matterName.PHP_EOL; echo "Test name : ".$testName.PHP_EOL; echo "Note : ".$note.PHP_EOL; echo "-----------------------------------".PHP_EOL.PHP_EOL; }); });
如果需要把数据存入数组统一处理,只需要在闭包中引入外部数组存储即可。
内容的提问来源于stack exchange,提问作者Quentin
相关产品推荐
相关产品推荐

