学习笔记之BeautifulSoup(2)——遍历文档树

在这里插入图片描述

(以下均以该文档举例说明)
遍历文档树
1.子节点
.一个Tag可能包含多个字符串或其它的Tag,这些都是这个Tag的子节点.Beautiful Soup提供了许多操作和遍历子节点的属性.
注意: Beautiful Soup中字符串节点不支持这些属性,因为字符串没有子节点。
(1)tag的名字
操作文档树最简单的方法就是告诉它你想获取的tag的name,可以在文档树的tag中多次调用这个方法;通过点取属性的方式只能获得当前名字的第一个tag,如果想要得到所有的指定标签,或是通过名字得到比一个tag更多的内容的时候,就需要用到 Searching the tree 中描述的方法,比如: find_all()。
代码:
在这里插入图片描述
运行结果:
在这里插入图片描述
(2).contents 和 .children
tag的 .contents 属性可以将tag的子节点以列表的方式输出;BeautifulSoup 对象本身一定会包含子节点,也就是说标签也是 BeautifulSoup 对象的子节点;字符串没有 .contents 属性,因为字符串没有子节点;通过tag的 .children 生成器,可以对tag的子节点进行循环。
代码:
在这里插入图片描述

运行结果:
在这里插入图片描述
(3).descendants
.contents 和 .children 属性仅包含tag的直接子节点,.descendants 属性可以对所有tag的子孙节点进行递归循环。
代码:
在这里插入图片描述

运行结果:
在这里插入图片描述

(4).string和 stripped_strings
如果tag只有一个 NavigableString 类型子节点,那么这个tag可以使用 .string 得到子节点;如果一个tag仅有一个子节点,那么这个tag也可以使用 .string 方法,输出结果与当前唯一子节点的 .string 结果相同;如果tag包含了多个子节点,tag就无法确定 .string 方法应该调用哪个子节点的内容, .string 的输出结果是 None;如果tag中包含多个字符串 ,可以使用 .strings 来循环获取,输出的字符串中可能包含了很多空格或空行,使用 .stripped_strings 可以去除多余空白内容。
代码:
在这里插入图片描述

运行结果:
在这里插入图片描述

2.父节点
每个tag或字符串都有父节点即被包含在某个tag中。
(1).parent
通过 .parent 属性来获取某个元素的父节点;文档title的字符串也有父节点:标签;文档的顶层节点比如的父节点是 BeautifulSoup 对象;BeautifulSoup 对象的 .parent 是None。

(2).parents
通过元素的 .parents 属性可以递归得到元素的所有父辈节点。
代码:
在这里插入图片描述

运行结果:
在这里插入图片描述

3.兄弟节点
同一个元素的子节点被称为兄弟节点.一段文档以标准格式输出时,兄弟节点有相同的缩进级别.在代码中也可以使用这种关系。
(1).next_sibling 和 .previous_sibling
在文档树中,使用 .next_sibling 和 .previous_sibling 属性来查询兄弟节点。
代码:
在这里插入图片描述

运行结果:
在这里插入图片描述

标签有 .next_sibling 属性,但是没有 .previous_sibling 属性,因为标签在同级节点中是第一个.同理,标签有 .previous_sibling 属性,却没有 .next_sibling 属性;字符串“text1”和“text2”不是兄弟节点,因为它们的父节点不同。
实际文档中的tag的 .next_sibling 和 .previous_sibling 属性通常是字符串或空白。
代码:
在这里插入图片描述

运行结果:
在这里插入图片描述

第一个a标签的 .next_sibling 结果不是第二个a标签,而是第一个a标签和第二个a标签之间的逗号和换行符,第二个a标签是逗号的 .next_sibling 属性。
(2).next_siblings 和 .previous_siblings
通过 .next_siblings 和 .previous_siblings 属性可以对当前节点的兄弟节点迭代输出。
代码:
在这里插入图片描述

运行结果:
在这里插入图片描述

4.回退和前进
HTML解析器把字符串转换成一连串的事件,Beautiful Soup提供了重现解析器初始化过程的方法。
(1).next_element 和 .previous_element
代码:
在这里插入图片描述

运行结果:
在这里插入图片描述

.next_sibling 结果是一个字符串,.next_element 属性结果是在a标签被解析之后的解析内容,不是a标签后的句子部分,应该是字符串”Tillie”,因为在原始文档中,字符串“Tillie” 在分号前出现,解析器先进入a标签,然后是字符串“Tillie”,然后关闭a标签,然后是分号和剩余部分.分号与a标签在同一层级,但是字符串“Tillie”会被先解析,.previous_element 属性刚好与 .next_element 相反,它指向当前被解析的对象的前一个解析对象。
(2).next_elements 和 .previous_elements
通过 .next_elements 和 .previous_elements 的迭代器就可以向前或向后访问文档的解析内容,就好像文档正在被解析一样。
代码:
在这里插入图片描述

运行结果:
在这里插入图片描述

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值