You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 17:36:01