
今天在学习PHP爬虫相关知识时,遇到了一个常见需求:从一段HTML代码中精准提取所有img标签的图片地址。经过尝试,发现QueryList这个PHP采集工具能完美解决这个问题,代码简洁又高效,特意记录下来分享给有需要的小伙伴。
先简单科普下,QueryList是基于PHPQuery开发的一套简洁、优雅的PHP采集工具,它融合了jQuery的选择器语法,让我们可以像操作前端DOM一样轻松解析HTML/XML,无需再手写复杂的正则表达式,极大降低了网页数据提取的门槛。
首先需要确保项目中已经安装了QueryList,推荐使用Composer安装:
composer require jaeger/querylist假设我们有一段包含图片的HTML代码(比如爬取到的文章封面、内容区域),需要提取其中所有img标签的src属性(图片地址),核心代码如下:
<?php
require 'vendor/autoload.php'; // 引入Composer自动加载文件
use QL\QueryList;
// 模拟待解析的HTML内容(实际场景中可替换为爬取到的网页源码)
$cover = '
<div class="content">
<img src="https://example.com/img1.jpg" alt="图片1">
<p>这是一段测试文本</p>
<img src="https://example.com/img2.png" layer-src="https://example.com/img2_hd.png" alt="图片2">
<div class="img-box">
<img src="https://example.com/img3.gif" alt="图片3">
</div>
</div>
';
// 第一步:使用QueryList解析HTML,提取所有img标签的src属性
// find('img') 匹配所有img标签,attrs('src') 获取标签的src属性值
$imgLayerSrcs = QueryList::html($cover)->find('img')->attrs('src');
// 第二步:将QueryList返回的Collection对象转换为纯PHP数组
$layerSrcArray = $imgLayerSrcs->toArray();
// 打印结果,查看提取的图片地址
var_dump($layerSrcArray);QueryList::html($cover):将待解析的HTML字符串传入QueryList,初始化解析对象;find('img'):使用jQuery风格的选择器匹配所有img标签;attrs('src'):提取匹配到的所有img标签的src属性值,返回的是QueryList封装的Collection集合对象;toArray():将Collection对象转换为普通的PHP数组,方便后续遍历、存储等操作。如果需要提取img标签的自定义属性(比如示例中的layer-src),只需修改attrs的参数即可:
// 提取layer-src属性
$imgLayerSrcs = QueryList::html($cover)->find('img')->attrs('layer-src');
$layerSrcArray = $imgLayerSrcs->toArray();
// 注意:如果标签没有该属性,对应位置会返回null,可后续过滤
$layerSrcArray = array_filter($layerSrcArray); // 过滤null值执行上述核心代码后,var_dump会输出如下结果:
array(3) {
[0]=>
string(24) "https://example.com/img1.jpg"
[1]=>
string(24) "https://example.com/img2.png"
[2]=>
string(24) "https://example.com/img3.gif"
}QueryList凭借jQuery风格的选择器,让PHP解析HTML变得极其简单。今天这个提取图片地址的小案例,只是QueryList众多功能的冰山一角,它还支持动态页面爬取、数据筛选、分页采集等高级功能。
对于PHP初学者来说,不用再纠结正则表达式的复杂语法,直接用QueryList就能快速实现常见的爬虫需求,大大提升开发效率。后续我也会继续学习QueryList的其他功能,分享更多实战技巧~
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。