如何使用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
相关产品推荐
相关产品推荐

