Python网络爬虫入门版笔记 六、基于bs4库的HTML遍历方法
一、结构介绍
当我们打开一个html文档时可以发现这是一个具有树形结构的文本。
以前面的演示界面来看,其树形结构为:
现在介绍三种遍历方式:下行遍历、上行遍历、平行遍历。
二、标签树的下行遍历
属性 |
说明 |
.contents |
子节点的列表,将<tag>所有儿子节点存入列表 |
.children |
子节点的迭代类型,与contents类似,用于循环遍历儿子节点 |
.descendants |
子孙节点的迭代类型,包含所有子孙节点,用于循环遍历 |
- 注意上面提到的遍历都是以节点为单位,而不是标签。
- 此外,需要注意到迭代类型这一类型,只能用于循环遍历,可以看做一种特殊的列表,只是这个列表中的值不能被直接打印出来,如果想查看这一类型中的值,可以借助list()函数,将其打印出来,方法演示为:
document = list(soup.a.descendants)
print(doucument)
1、用法演示:
代码中,第八行的含义为打印出head节点的所有子节点(列表形式),第九行为打印body标签的所含子节点的长度,结果为5,而其子节点的列表为:
可以发现列表的5个元素当中有三个换行符。
所以,节点不仅仅可以是标签,也可以是其他类型的。
2、下行遍历
(1)遍历所有儿子节点
(2)遍历所有子孙节点
二、标签树的上行遍历
属性 |
说明 |
.parent |
节点的父亲节点 |
.parents |
节点先辈标签的迭代类型,用于循环遍历先辈节点 |
1、使用演示
略、与上面基本相同。
这里需要有几点注意:
- html标签(即html文件中最顶层的标签)的父亲标签就是自己本身
- soup(整个html文档)本身也是一种特殊的标签,它的父标签为None,即没有父标签
2、上行遍历
这里给出上行遍历的框架
上述代码运行结果为:
这里对代码和结果进行一定的解释,首先解释为什么要判断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、遍历平行前续/后续节点
遍历后续节点:
遍历前续节点: