电话
400 9058 355
本文介绍在解析电商比价页面时,如何通过字符串预处理结合正则匹配,跳过顶部广告区块、准确提取所有真实商家信息(每个以 `
` 开始、以 `` 或 `` 结束的区块)。在实际网页抓取(如解析 ZAP.co.il 商品比价页)过程中,常遇到结构相似但语义不同的 HTML 区块:顶部是推广广告商家(同样使用
),而下方才是真实比价结果。若直接对全文用 preg_match_all() 匹配 StoreLine 到 BuyButtons 的闭合区块,会错误包含广告内容。核心思路不是“在正则中跳过前 N 个”——而是先定位语义分界点,截断无关前导 HTML,再进行精确匹配。
该页面中,广告区与真实比价区之间存在一个稳定的结构锚点:
// 截取从第一个 开始的子串(含该标签)
$str = strstr($str, '');
if ($str === false) {
throw new RuntimeException('未找到 SortBy 分隔标识,可能页面结构已变更');
}完成预处理后,再执行安全、非贪婪的正则匹配:
$pattern = '/(.*?)<(?:div\s+class="SmartBuyButtons"|div\s+class="BuyButtons")>/is';
preg_match_all($pattern, $str, $matches, PREG_SET_ORDER);
// $matches 现在只包含真实商家区块(含完整 HTML 片段)
$stores = [];
foreach ($matches as $match) {
$stores[] = $match[0]; // 完整匹配字符串(含 StoreLine 至 BuyButtons)
}✅ 关键优化说明:

⚠️ 注意事项:
总结:正则表达式擅长“局部模式匹配”,但面对复杂 HTML 层级结构时,“先宏观截断、再微观提取”往往比强行设计超长正则更简洁、高效且易于调试。
邮箱:8955556@qq.com
Q Q:8955556
本文详解如何将Go官方present工具(用于生成HTML5...
PySNMP在不同版本中对SNMP错误状态(errorSta...
time.Sleep仅阻塞当前goroutine,其他gor...
PHPfopen()创建含特殊符号的文件名失败主因是操作系统...
WooCommerce中通过代码为分组产品动态聚合子商品的属...
io.ReadFull返回io.ErrUnexpectedE...
本文详解Yii2中控制器向视图传递ActiveRecord数...
本文详解为何通过wp_set_object_terms()为...
Pytest中使用@mock.patch类装饰器会导致补丁泄...
带缓冲的channel是并发安全的FIFO队列;make(c...