Python网络爬虫入门版笔记 六、基于bs4库的HTML遍历方法

一、结构介绍

当我们打开一个html文档时可以发现这是一个具有树形结构的文本。

以前面的演示界面来看,其树形结构为:

Python网络爬虫入门版笔记 六、基于bs4库的HTML遍历方法

现在介绍三种遍历方式:下行遍历、上行遍历、平行遍历。

 

二、标签树的下行遍历

属性

说明

.contents

子节点的列表,将<tag>所有儿子节点存入列表

.children

子节点的迭代类型,与contents类似,用于循环遍历儿子节点

.descendants

子孙节点的迭代类型,包含所有子孙节点,用于循环遍历

  • 注意上面提到的遍历都是以节点为单位,而不是标签
  • 此外,需要注意到迭代类型这一类型,只能用于循环遍历,可以看做一种特殊的列表,只是这个列表中的值不能被直接打印出来,如果想查看这一类型中的值,可以借助list()函数,将其打印出来,方法演示为:

document = list(soup.a.descendants)

print(doucument)

1、用法演示:

Python网络爬虫入门版笔记 六、基于bs4库的HTML遍历方法

代码中,第八行的含义为打印出head节点的所有子节点(列表形式),第九行为打印body标签的所含子节点的长度,结果为5,而其子节点的列表为:

Python网络爬虫入门版笔记 六、基于bs4库的HTML遍历方法

可以发现列表的5个元素当中有三个换行符。

所以,节点不仅仅可以是标签,也可以是其他类型的。

 

2、下行遍历

(1)遍历所有儿子节点

Python网络爬虫入门版笔记 六、基于bs4库的HTML遍历方法

 

(2)遍历所有子孙节点

Python网络爬虫入门版笔记 六、基于bs4库的HTML遍历方法

 

 

二、标签树的上行遍历

属性

说明

.parent

节点的父亲节点

.parents

节点先辈标签的迭代类型,用于循环遍历先辈节点

1、使用演示

略、与上面基本相同。

这里需要有几点注意:

  • html标签(即html文件中最顶层的标签)的父亲标签就是自己本身
  • soup(整个html文档)本身也是一种特殊的标签,它的父标签为None,即没有父标签

 

2、上行遍历

这里给出上行遍历的框架

Python网络爬虫入门版笔记 六、基于bs4库的HTML遍历方法

上述代码运行结果为:

Python网络爬虫入门版笔记 六、基于bs4库的HTML遍历方法

这里对代码和结果进行一定的解释,首先解释为什么要判断parent是否为空,soup中的a标签向上遍历父辈标签时也会遍历到soup本身,但soup本身并不存在父标签,所以为了避免程序出现错误,需要进行一次判断。其次,输出的最后一个结果是[document],是因为html标签为整个文件中最高层级的标签,其父标签也就是自己本身,也就是整个document。

 

三、标签树的平行遍历

属性

说明

.next_sibling

返回按照HTML文本顺序的下一个平行节点标签

.previous_sibling

返回按照HTML文本顺序的上一个平行节点标签

.next_siblings

迭代类型,返回按照HTML文本顺序的后续所有的平行节点标签

.previous_sibling

迭代类型,返回按照HTML文本顺序的前续所有平行节点标签

首先需要知道的是,所有平行遍历是要前提条件的:平行遍历只发生在同一个父亲节点下的各节点之间,不同父亲节点下的标签无法构成平行遍历关系。

1、使用演示

在前面的基础上,执行下面代码:

print(soup.a.next_sibling)

后出现的结果为一个字符串:

 and

而并不是一个标签,而是一个NavigableString类型的字符串出现这样的原因是,NavigableString也可以作为遍历过程中的一个节点。

 

2、遍历平行前续/后续节点

遍历后续节点:

Python网络爬虫入门版笔记 六、基于bs4库的HTML遍历方法

 

遍历前续节点:

Python网络爬虫入门版笔记 六、基于bs4库的HTML遍历方法