QueryList range($selector)
区域选择器
或者叫做切片选择器
,指先按照该规则对HTML内容进行切片 ,然后再分别再在这些切片里面进行相关的选择。当采集列表的时候,建议设置这个参数。
用法
//第一种写法:没有用到[区域选择器]
$ql = QueryList::get('http://www.baidu.com/s?wd=QueryList')->rules([
'title'=>array('h3','text'),
'link'=>array('h3>a','href')
]);
//第二种写法:用选择器'h3'对内容切片,然后分别在这些切片中执行采集规则
$ql = QueryList::get('http://www.baidu.com/s?wd=QueryList')->rules([
// 获取当前切片的整个text内容
'title'=>array('','text'),
// 获取当前切片下的a标签链接
'link'=>array('a','href')
])->range('h3');
<?php
require 'querylist/vendor/autoload.php';
use QL\QueryList;
//采集#main下面的li里面的内容
$html =<<<STR
<div id="main">
<ul>
<li>
<h1>这是标题1</h1>
<span>这是文字1<span>
</li>
<li>
<h1>这是标题2</h1>
<span>这是文字2<span>
</li>
</ul>
</div>
STR;
//方法一,不推荐
$data = QueryList::html($html)->rules([
'title' => array('#main>ul>li>h1','text'),
'content' => array('#main>ul>li>span','text')
])->query()->getData();
print_r($data->all());
//方法二,设置范围选择器
$data = QueryList::html($html)->rules([
'list' => array('h1','text'),
'content' => array('span','text')
])->range('#main>ul>li')->query()->getData();
print_r($data->all());
/**
两种方式的输出结果都相同:
Array
(
[0] => Array
(
[title] => 这是标题1
[content] => 这是文字1
)
[1] => Array
(
[title] => 这是标题2
[content] => 这是文字2
)
)
*/
//但方法一有严重的缺陷,例如html变成这样,其它代码不变
$html =<<<STR
<div id="main">
<ul>
<li>
<h1>这是标题1</h1>
</li>
<li>
<h1>这是标题2</h1>
<span>这是文字2<span>
</li>
</ul>
</div>
STR;
/**
方法一输出结果,结果已经错位了:
Array
(
[0] => Array
(
[title] => 这是标题1
[content] => 这是文字2
)
[1] => Array
(
[title] => 这是标题2
)
)
方法二输出结果,依旧正确:
Array
(
[0] => Array
(
[list] => 这是标题1
[content] =>
)
[1] => Array
(
[list] => 这是标题2
[content] => 这是文字2
)
)
*/