递归多级采集

可以在getData()方法中多次调用QueryList来实现递归多级采集。

使用场景:如采集多级菜单,需要先采集第一级菜单,然后采集第二级菜单,以此类推。

示例

采集代码:

  1. <?php
  2. require 'QueryList/vendor/autoload.php';
  3. use QL\QueryList;
  4. //获取每个li里面的h3标签内容,和class为item的元素内容
  5. $html =<<<STR
  6. <div id="demo">
  7. <ul>
  8. <li>
  9. <h3>xxx</h3>
  10. <div class="list">
  11. <div class="item">item1</div>
  12. <div class="item">item2</div>
  13. </div>
  14. </li>
  15. <li>
  16. <h3>xxx2</h3>
  17. <div class="list">
  18. <div class="item">item12</div>
  19. <div class="item">item22</div>
  20. </div>
  21. </li>
  22. </ul>
  23. </div>
  24. STR;
  25. $data = QueryList::html($html)->rules(array(
  26. 'title' => array('h3','text'),
  27. 'list' => array('.list','html')
  28. ))->range('#demo li')->queryData(function($item){
  29. // 注意这里的QueryList对象与上面的QueryList对象是同一个对象
  30. // 所以这里要重置range()参数,否则会共用前面的range()参数,导致出现采集不到结果的诡异现象
  31. $item['list'] = QueryList::html($item['list'])->rules(array(
  32. 'item' => array('.item','text')
  33. ))->range('')->queryData();
  34. return $item;
  35. });
  36. print_r($data);

采集结果:

  1. Array
  2. (
  3. [0] => Array
  4. (
  5. [title] => xxx
  6. [list] => Array
  7. (
  8. [0] => Array
  9. (
  10. [item] => item1
  11. )
  12. [1] => Array
  13. (
  14. [item] => item2
  15. )
  16. )
  17. )
  18. [1] => Array
  19. (
  20. [title] => xxx2
  21. [list] => Array
  22. (
  23. [0] => Array
  24. (
  25. [item] => item12
  26. )
  27. [1] => Array
  28. (
  29. [item] => item22
  30. )
  31. )
  32. )
  33. )