
本文介绍在 php 中通过原生 dom + xpath 或 symfony domcrawler 组件,高效筛选并提取具有特定 class 名(如含空格的复合类名)的 div 元素,适用于体育赛程等结构化网页抓取场景。
本文介绍在 php 中通过原生 dom + xpath 或 symfony domcrawler 组件,高效筛选并提取具有特定 class 名(如含空格的复合类名)的 div 元素,适用于体育赛程等结构化网页抓取场景。
在网页抓取(Web Scraping)实践中,精准定位目标元素是关键一步。尤其当目标 <div> 拥有多个 CSS 类(如 class="sdc-site-fixres__match-cell sdc-site-fixres__match-cell--score"),仅依赖 Simple HTML DOM 的 find('div[class="..."]') 容易因空格、顺序或部分匹配而失效——它不支持 CSS 类名的语义化匹配(即“同时包含所有指定类”),且对动态/复杂 HTML 结构鲁棒性较差。
更可靠的方式是使用 PHP 原生的 DOMDocument 配合 DOMXPath,通过 XPath 表达式精确匹配:
$day = 1;
$url = 'https://sport.sky.de/bundesliga-spielplan-ergebnisse-' . $day;
$html = file_get_contents($url);
// 加载 HTML 并忽略解析警告(可选)
libxml_use_internal_errors(true);
$doc = DOMDocument::loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
libxml_clear_errors();
$xpath = new DOMXPath($doc);
// XPath 查询:查找同时拥有两个 class 的 div,再获取其内部第2个 <span>
$query = $xpath->query('//div[contains(@class, "sdc-site-fixres__match-cell") and contains(@class, "sdc-site-fixres__match-cell--score")]/div/span[2]');
foreach ($query as $node) {
/** @var DOMElement $node */
echo trim($node->textContent) . PHP_EOL;
}✅ 关键说明:
- 使用 contains(@class, "...") 而非 @class="...",避免因 class 顺序、额外空格或动态追加类导致匹配失败;
- LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD 可防止自动补全 <html><body> 标签,提升结构一致性;
- trim() 和 textContent 比 nodeValue 更安全,有效去除首尾空白与换行。
? 进阶推荐:Symfony DomCrawler(生产环境首选)
若项目已使用 Symfony 或可引入 Composer 包,symfony/dom-crawler 提供更直观、链式、CSS 选择器友好的 API:
composer require symfony/dom-crawler symfony/css-selector
use Symfony\Component\DomCrawler\Crawler;
$html = file_get_contents('https://sport.sky.de/bundesliga-spielplan-ergebnisse-1');
$crawler = new Crawler($html);
// 支持标准 CSS 选择器,自动处理多 class 匹配
$nodes = $crawler
->filter('div.sdc-site-fixres__match-cell.sdc-site-fixres__match-cell--score div span:nth-child(2)');
foreach ($nodes as $node) {
echo trim($node->textContent) . "\n";
}⚠️ 注意事项:
立即学习“PHP免费学习笔记(深入)”;
- 目标网站可能有反爬机制(如 User-Agent 检查、JavaScript 渲染),需添加请求头或改用 Puppeteer/Playwright;
- file_get_contents() 不支持 HTTPS 重定向或 Cookie 管理,建议搭配 cURL 封装;
- Simple HTML DOM 已停止维护,新项目应避免使用,优先选择原生 DOM 或成熟组件。
综上,XPath 是轻量级、无依赖的精准匹配方案;而 DomCrawler 则在可维护性、测试友好性和生态整合上更具优势——二者均优于基于字符串匹配的传统解析方式。



















