QueryList 如何实现多级递归采集?
发布于 作者:苏南大叔 来源:程序如此灵动~ 我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...
在以前的文章里面,苏南大叔举的例子都是只采集一次就成型的。但是,事实上在实际情况中,经常会碰到需要递归多层采集的情况,那么本文中,苏南大叔就拿着官方的例子,说一下递归多级采集的代码写法:
基本说明
可以在getData()
方法中多次调用QueryList
来实现递归多级采集。所以基本套路是这样的:
$ql->getData(function($item){
$item['...'] = QueryList::html($item['...'])->...()->query()->getData();
return $item;
});
上面的是套路代码,注意替换...
字样。
代码示例
require 'QueryList/vendor/autoload.php';
use QL\QueryList;
//获取每个li里面的h3标签内容,和class为item的元素内容
$html =<<<STR
<div id="demo">
<ul>
<li>
<h3>xxx</h3>
<div class="list">
<div class="item">item1</div>
<div class="item">item2</div>
</div>
</li>
<li>
<h3>xxx2</h3>
<div class="list">
<div class="item">item12</div>
<div class="item">item22</div>
</div>
</li>
</ul>
</div>
STR;
$data = QueryList::html($html)->rules(array(
'title' => array('h3','text'),
'list' => array('.list','html')
))->range('#demo li')->query()->getData(function($item){
$item['list'] = QueryList::html($item['list'])->rules(array(
'item' => array('.item','text')
))->query()->getData();
return $item;
});
print_r($data);
结果类似如下:
Array
(
[0] => Array
(
[title] => xxx
[list] => Array
(
[0] => Array
(
[item] => item1
)
[1] => Array
(
[item] => item2
)
)
)
[1] => Array
(
[title] => xxx2
[list] => Array
(
[0] => Array
(
[item] => item12
)
[1] => Array
(
[item] => item22
)
)
)
)
总结
苏南大叔的QueryList
系列教程基础部分,就到这里暂告一个段落。在未来的文章里面,苏南大叔计划描述一下QueryList
的插件体系。通过这些插件的安装使用,就可以为QueryList
增加很多新的功能了。
这里也许有两个插件,在日常工作中,是大家可能会用到的。大家可以看看。
- AbsoluteUrl - URL转绝对路径 https://doc.querylist.cc/site/index/doc/35
- CurlMulti - 多线程采集 https://doc.querylist.cc/site/index/doc/36
更多苏南大叔的QueryList
的经验文章,记得查看下面的链接:
如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。