QueryList API文档

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
        )
)
 */