PHP如何抓取网页中两个指定HTML标签之间的内容
结论
你编写的preg_match代码无法实现需求,存在多处语法、逻辑错误,且正则匹配HTML的方案本身容错性极差,不适合这类场景。
原代码的具体错误
- 参数类型错误:
file()函数返回的是按行分割的数组,而preg_match要求第二个参数传入字符串类型的待匹配内容,直接传入数组会导致匹配失败 - 正则语法错误:正则规则中多写了冗余的
</符号,边界匹配逻辑错误 - 语法结构错误:
preg_match第三个参数应为接收完整匹配结果的数组,你传入$match[1]属于写法错误;且正则调用语句和后续输出的大括号没有绑定关系,语法逻辑不成立 - 容错性极差:正则完全硬编码匹配标签的完整字符串,只要目标网站调整标签属性顺序、增减空格、修改style属性值的格式,就会直接匹配失败
- 无异常处理:抓取失败、匹配失败时无兜底逻辑,会直接抛出错误或输出空内容
正确实现方案
不要用正则解析HTML,使用PHP内置的DOMDocument + XPath做节点定位,不依赖行号,只要标签的唯一标识(id)不变就能稳定匹配,不受中间代码变动、标签属性微调影响。
可直接运行的代码如下:
<?php // 拉取完整网页内容,不拆分为行数组 $html = file_get_contents("https://the-url.com"); if (!$html) { exit("网页抓取失败"); } // 屏蔽HTML不规范导致的解析警告 libxml_use_internal_errors(true); $dom = new DOMDocument(); $dom->loadHTML($html); libxml_clear_errors(); $xpath = new DOMXPath($dom); // 通过唯一id定位起止节点,不需要硬编码class、style等易变属性 $startNode = $xpath->query('//div[@id="result_list"]')->item(0); $endNode = $xpath->query('//h3[@id="alternativen_text"]')->item(0); if (!$startNode || !$endNode) { exit("未匹配到指定的起止标签"); } $content = ""; // 先写入起始节点本身的内容 $content .= $dom->saveHTML($startNode); $current = $startNode; // 遍历起始节点后的所有同级节点,直到碰到结束节点为止 while ($current = $current->nextSibling) { if ($current === $endNode) { break; } $content .= $dom->saveHTML($current); } // 输出提取的内容 echo $content; ?>
方案说明
- 不依赖固定行号,目标网站中间内容增删改完全不影响匹配结果
- 以标签唯一id作为定位依据,不受标签属性顺序调整、多余空格、style/class属性修改影响
- 兼容不规范的HTML代码,稳定性远高于正则匹配方案
- 后续维护成本低,若标签变动仅需调整XPath定位规则即可
内容的提问来源于stack exchange,提问作者bruno2000
相关产品推荐
相关产品推荐

