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

如何使用PHP DOMDocument通过类名获取表格单元格?

没问题,我来帮你搞定这个需求!你已经通过DOMDocument加载了目标表格,并且拿到了所有带match类的<tr>标签,接下来可以通过两种方式提取这些行里对应类名的单元格内容:

方法一:遍历所有td并判断类名

这种方法适合对DOM操作比较熟悉的场景,逐个遍历当前<tr>下的所有<td>,通过检查class属性来区分不同类型的单元格:

// 先确保你已经获取了所有带match类的tr元素
$xpath = new DOMXPath($dom);
$matchTrs = $xpath->query('//tr[contains(@class, "match")]');

foreach ($matchTrs as $tr) {
    $matchData = [];
    // 获取当前tr下的所有td
    $tds = $tr->getElementsByTagName('td');
    
    foreach ($tds as $td) {
        $tdClass = $td->getAttribute('class');
        
        // 提取比赛时长(比如89'、HT)
        if (str_contains($tdClass, 'minute')) {
            $matchData['minute'] = trim($td->nodeValue);
        }
        // 提取主队信息
        elseif (str_contains($tdClass, 'team-a')) {
            $teamLink = $td->getElementsByTagName('a')->item(0);
            if ($teamLink) {
                $matchData['home_team'] = trim($teamLink->nodeValue);
                $matchData['home_team_url'] = $teamLink->getAttribute('href');
            }
        }
        // 提取比分和比赛详情链接
        elseif (str_contains($tdClass, 'score')) {
            $scoreLink = $td->getElementsByTagName('a')->item(0);
            if ($scoreLink) {
                $matchData['score'] = trim($scoreLink->nodeValue);
                $matchData['match_detail_url'] = $scoreLink->getAttribute('href');
            }
        }
        // 提取客队信息
        elseif (str_contains($tdClass, 'team-b')) {
            $teamLink = $td->getElementsByTagName('a')->item(0);
            if ($teamLink) {
                $matchData['away_team'] = trim($teamLink->nodeValue);
                $matchData['away_team_url'] = $teamLink->getAttribute('href');
            }
        }
        // 提取赛事事件和更多信息链接(可选)
        elseif (str_contains($tdClass, 'events-button')) {
            $eventsLink = $td->getElementsByTagName('a')->item(0);
            if ($eventsLink) {
                $matchData['events_url'] = $eventsLink->getAttribute('href');
            }
        }
        elseif (str_contains($tdClass, 'info-button')) {
            $infoLink = $td->getElementsByTagName('a')->item(0);
            if ($infoLink) {
                $matchData['more_info_url'] = $infoLink->getAttribute('href');
            }
        }
    }
    
    // 处理完当前比赛的数据,比如打印或存入数组
    print_r($matchData);
}

方法二:用XPath直接定位(更简洁高效)

XPath可以直接在当前<tr>范围内查询指定类的元素,省去遍历所有td的步骤,代码更简洁:

// 初始化XPath
$xpath = new DOMXPath($dom);
// 获取所有带match类的tr
$matchTrs = $xpath->query('//tr[contains(@class, "match")]');

foreach ($matchTrs as $tr) {
    $matchData = [];
    
    // 提取比赛时长
    $minuteNode = $xpath->query('.//td[contains(@class, "minute")]', $tr)->item(0);
    if ($minuteNode) {
        $matchData['minute'] = trim($minuteNode->nodeValue);
    }
    
    // 提取主队信息
    $homeTeamNode = $xpath->query('.//td[contains(@class, "team-a")]/a', $tr)->item(0);
    if ($homeTeamNode) {
        $matchData['home_team'] = trim($homeTeamNode->nodeValue);
        $matchData['home_team_url'] = $homeTeamNode->getAttribute('href');
    }
    
    // 提取比分和比赛链接
    $scoreNode = $xpath->query('.//td[contains(@class, "score")]/a', $tr)->item(0);
    if ($scoreNode) {
        $matchData['score'] = trim($scoreNode->nodeValue);
        $matchData['match_detail_url'] = $scoreNode->getAttribute('href');
    }
    
    // 提取客队信息
    $awayTeamNode = $xpath->query('.//td[contains(@class, "team-b")]/a', $tr)->item(0);
    if ($awayTeamNode) {
        $matchData['away_team'] = trim($awayTeamNode->nodeValue);
        $matchData['away_team_url'] = $awayTeamNode->getAttribute('href');
    }
    
    // 提取赛事事件和更多信息链接(可选)
    $eventsNode = $xpath->query('.//td[contains(@class, "events-button")]/a', $tr)->item(0);
    if ($eventsNode) {
        $matchData['events_url'] = $eventsNode->getAttribute('href');
    }
    $infoNode = $xpath->query('.//td[contains(@class, "info-button")]/a', $tr)->item(0);
    if ($infoNode) {
        $matchData['more_info_url'] = $infoNode->getAttribute('href');
    }
    
    // 输出或存储数据
    print_r($matchData);
}

注意事项

  • 因为HTML元素的class属性可能包含多个值(比如even highlight expanded first last match no-date-repetition),所以要用contains(@class, "xxx")来匹配,而不是直接用@class="xxx"。
  • 如果加载HTML时遇到语法错误,可以先开启错误忽略:
    libxml_use_internal_errors(true); // 忽略HTML解析错误
    $dom = new DOMDocument();
    $dom->loadHTML("包含表格的字符串");
    libxml_clear_errors(); // 清除错误缓存
    

内容的提问来源于stack exchange,提问作者utop

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:26:25