元素操作

QueryList不仅可以读取DOM元素的属性值,还可以操作DOM元素。


采集单元素章节,我们接触到了find()方法,它用于选择DOM元素,返回值为QL\Dom\Elements对象,这是QueryList内置的一个DOM元素集合对象,它拥有几乎所有与jQuery操作DOM完全相同的API

熟悉jQuery的同学应该知道jQuery操作DOM的API方法非常的多,QueryList几乎全部支持,下面选择性的讲些一些元素操作的API,大家举一反三。

替换元素属性值

attr()方法除了可以取DOM元素属性值外,还有第二个参数,用于设置元素属性值。

text()方法默认无参调用表示获取元素的纯文本内容,加个参数调用就表示设置元素的内容。

使用场景:比如采集文章时,下载文章中的图片,并替换文章中的图片路径为本地路径。

采集代码:

  1. use QL\QueryList;
  2. $html =<<<STR
  3. <div>
  4. <a href="https://querylist.cc" alt="abc">QueryList</a>
  5. </div>
  6. STR;
  7. $ql = QueryList::html($html);
  8. // 获取a元素对象
  9. $link = $ql->find('a:eq(0)');
  10. // 设置元素属性值
  11. $link->attr('href','https://baidu.com');
  12. $link->attr('alt','百度');
  13. // 设置元素内容
  14. $link->text('百度一下');
  15. $data = $ql->find('div')->html();
  16. print_r($data);

采集结果:

  1. <a href="https://baidu.com" alt="百度">百度一下</a>

html()方法用法与text()方法相同,唯一区别是可以用于设置元素的内容为HTML内容。

  1. $link->html('<p>百度一下</p>');

输出:

  1. <a href="https://baidu.com" alt="百度"><p>百度一下</p></a>

追加元素

append()方法用于追加元素。

采集代码:

  1. use QL\QueryList;
  2. $html =<<<STR
  3. <div>
  4. <a href="https://querylist.cc" alt="abc">QueryList</a>
  5. </div>
  6. STR;
  7. $ql = QueryList::html($html);
  8. // 获取div元素对象
  9. $div = $ql->find('div:eq(0)');
  10. // 向div元素中追加一个img元素
  11. $div->append('<img src="1.jpg" />');
  12. $rt = [];
  13. $rt[] = $div->find('img')->attr('src');
  14. $rt[]= $ql->find('div')->html();
  15. print_r($rt);

采集结果:

  1. Array
  2. (
  3. [0] => 1.jpg
  4. [1] => <a href="https://querylist.cc" alt="abc">QueryList</a>
  5. <img src="1.jpg">
  6. )

移除元素

remove()方法用于移除元素,常用于移除采集内容中的无关内容,在内容过滤章节有详细讲解到。

  1. $ql->find('div')->remove('img');

替换元素

replaceWith()方法用于替换元素。

下面例子替换所有链接为文本。

采集代码:

  1. use QL\QueryList;
  2. $html =<<<STR
  3. <div>
  4. <a href="https://qq.com">QQ</a>
  5. <a class="ql" href="https://querylist.cc" alt="abc">QueryList</a>
  6. <a href="https://baidu.com">百度一下</a>
  7. </div>
  8. STR;
  9. $ql = QueryList::html($html);
  10. $ql->find('a')->map(function($a){
  11. $text = $a->text();
  12. $a->replaceWith('<span>'.$text.'</span>');
  13. });
  14. $rt = $ql->find('div')->html();
  15. print_r($rt);

采集结果:

  1. <span>QQ</span>
  2. <span>QueryList</span>
  3. <span>百度一下</span>

移除元素属性

removeAttr()方法可用来移除元素属性。

采集代码:

  1. use QL\QueryList;
  2. $html =<<<STR
  3. <div>
  4. <a href="https://qq.com" alt="123">QQ</a>
  5. <a class="ql" href="https://querylist.cc" alt="abc">QueryList</a>
  6. <a href="https://baidu.com">百度一下</a>
  7. </div>
  8. STR;
  9. $ql = QueryList::html($html);
  10. $ql->find('a')->removeAttr('alt');
  11. $rt = $ql->find('div')->html();
  12. print_r($rt);

采集结果:

  1. <a href="https://qq.com">QQ</a>
  2. <a class="ql" href="https://querylist.cc">QueryList</a>
  3. <a href="https://baidu.com">百度一下</a>

获取父元素、临近元素

parent()方法用于获取当前元素的父元素。

next()prev()方法用于获取当前元素临近的下一个元素和上一个元素。

使用场景:当你想选择的元素没有明显的特征,如:class、id等,此时就可以选择与之相关联的元素,通过关联元素选择到你想要选择的元素。

采集代码:

  1. use QL\QueryList;
  2. $html =<<<STR
  3. <div>
  4. <a href="https://qq.com">QQ</a>
  5. <a class="ql" href="https://querylist.cc" alt="abc">QueryList</a>
  6. <a href="https://baidu.com">百度一下</a>
  7. </div>
  8. STR;
  9. $ql = QueryList::html($html);
  10. // 获取class为 ql 的元素对象
  11. $link = $ql->find('.ql');
  12. $rt = [];
  13. // 获取父元素的内容
  14. $rt['parent'] = $link->parent()->html();
  15. // 获取临近的下一个元素的内容
  16. $rt['next'] = $link->next()->text();
  17. // 获取临近的前一个元素的属性
  18. $rt['prev'] = $link->prev()->attr('href');
  19. print_r($rt);

采集结果:

  1. Array
  2. (
  3. [parent] => <a href="https://qq.com">QQ</a>
  4. <a class="ql" href="https://querylist.cc" alt="abc">QueryList</a>
  5. <a href="https://baidu.com">百度一下</a>
  6. [next] => 百度一下
  7. [prev] => https://qq.com
  8. )