QueryList range($selector)



  • 区域选择器或者叫做切片选择器,指先按照该规则对HTML内容进行切片 ,然后再分别再在这些切片里面进行相关的选择。当采集列表的时候,建议设置这个参数。

用法


  • 例一采集百度搜索结果,下面两种写法采集结果一致
  1. //第一种写法:没有用到[区域选择器]
  2. $ql = QueryList::get('http://www.baidu.com/s?wd=QueryList')->rules([
  3. 'title'=>array('h3','text'),
  4. 'link'=>array('h3>a','href')
  5. ]);
  6. //第二种写法:用选择器'h3'对内容切片,然后分别在这些切片中执行采集规则
  7. $ql = QueryList::get('http://www.baidu.com/s?wd=QueryList')->rules([
  8. // 获取当前切片的整个text内容
  9. 'title'=>array('','text'),
  10. // 获取当前切片下的a标签链接
  11. 'link'=>array('a','href')
  12. ])->range('h3');
  • 例二
  1. <?php
  2. require 'querylist/vendor/autoload.php';
  3. use QL\QueryList;
  4. //采集#main下面的li里面的内容
  5. $html =<<<STR
  6. <div id="main">
  7. <ul>
  8. <li>
  9. <h1>这是标题1</h1>
  10. <span>这是文字1<span>
  11. </li>
  12. <li>
  13. <h1>这是标题2</h1>
  14. <span>这是文字2<span>
  15. </li>
  16. </ul>
  17. </div>
  18. STR;
  19. //方法一,不推荐
  20. $data = QueryList::html($html)->rules([
  21. 'title' => array('#main>ul>li>h1','text'),
  22. 'content' => array('#main>ul>li>span','text')
  23. ])->query()->getData();
  24. print_r($data->all());
  25. //方法二,设置范围选择器
  26. $data = QueryList::html($html)->rules([
  27. 'list' => array('h1','text'),
  28. 'content' => array('span','text')
  29. ])->range('#main>ul>li')->query()->getData();
  30. print_r($data->all());
  31. /**
  32. 两种方式的输出结果都相同:
  33. Array
  34. (
  35. [0] => Array
  36. (
  37. [title] => 这是标题1
  38. [content] => 这是文字1
  39. )
  40. [1] => Array
  41. (
  42. [title] => 这是标题2
  43. [content] => 这是文字2
  44. )
  45. )
  46. */
  47. //但方法一有严重的缺陷,例如html变成这样,其它代码不变
  48. $html =<<<STR
  49. <div id="main">
  50. <ul>
  51. <li>
  52. <h1>这是标题1</h1>
  53. </li>
  54. <li>
  55. <h1>这是标题2</h1>
  56. <span>这是文字2<span>
  57. </li>
  58. </ul>
  59. </div>
  60. STR;
  61. /**
  62. 方法一输出结果,结果已经错位了:
  63. Array
  64. (
  65. [0] => Array
  66. (
  67. [title] => 这是标题1
  68. [content] => 这是文字2
  69. )
  70. [1] => Array
  71. (
  72. [title] => 这是标题2
  73. )
  74. )
  75. 方法二输出结果,依旧正确:
  76. Array
  77. (
  78. [0] => Array
  79. (
  80. [list] => 这是标题1
  81. [content] =>
  82. )
  83. [1] => Array
  84. (
  85. [list] => 这是标题2
  86. [content] => 这是文字2
  87. )
  88. )
  89. */