在使用 QueryList 进行递归采集时,range
方法用于指定采集的范围。如果你希望在递归采集时避免数据合并,可以通过以下方式来实现:
each
方法替代 range
each
方法可以逐个处理采集到的数据,而不是一次性合并所有数据。这样可以避免数据合并的问题。
use QL\QueryList;
$url = 'http://example.com';
$rules = [
'title' => ['h1', 'text'],
'content' => ['div.content', 'html']
];
$data = QueryList::get($url)->rules($rules)->query()->getData();
$data->each(function($item) {
// 处理每个采集到的数据项
print_r($item);
});
map
方法map
方法可以对采集到的数据进行逐个处理,并且返回一个新的集合,避免数据合并。
use QL\QueryList;
$url = 'http://example.com';
$rules = [
'title' => ['h1', 'text'],
'content' => ['div.content', 'html']
];
$data = QueryList::get($url)->rules($rules)->query()->getData();
$processedData = $data->map(function($item) {
// 对每个数据项进行处理
return [
'title' => $item['title'],
'content' => $item['content']
];
});
print_r($processedData->all());
range
方法时手动处理数据如果你仍然需要使用 range
方法,可以在递归采集时手动处理数据,避免数据合并。
use QL\QueryList;
function recursiveCollect($url, $rules, $range) {
$data = QueryList::get($url)->rules($rules)->range($range)->query()->getData();
$result = [];
$data->each(function($item) use (&$result) {
// 手动处理每个数据项
$result[] = $item;
});
return $result;
}
$url = 'http://example.com';
$rules = [
'title' => ['h1', 'text'],
'content' => ['div.content', 'html']
];
$range = 'div.item';
$result = recursiveCollect($url, $rules, $range);
print_r($result);
reduce
方法reduce
方法可以对采集到的数据进行逐个处理,并且可以自定义数据的合并方式。
use QL\QueryList;
$url = 'http://example.com';
$rules = [
'title' => ['h1', 'text'],
'content' => ['div.content', 'html']
];
$data = QueryList::get($url)->rules($rules)->query()->getData();
$processedData = $data->reduce(function($carry, $item) {
// 自定义数据的合并方式
$carry[] = [
'title' => $item['title'],
'content' => $item['content']
];
return $carry;
}, []);
print_r($processedData);
通过使用 each
、map
、reduce
等方法,你可以在递归采集时避免数据合并的问题。根据你的具体需求选择合适的方法来处理采集到的数据。