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

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

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

运行结果:
学习笔记之BeautifulSoup(2)——遍历文档树
(3).descendants
.contents 和 .children 属性仅包含tag的直接子节点,.descendants 属性可以对所有tag的子孙节点进行递归循环。
代码:
学习笔记之BeautifulSoup(2)——遍历文档树

运行结果:
学习笔记之BeautifulSoup(2)——遍历文档树

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

运行结果:
学习笔记之BeautifulSoup(2)——遍历文档树

2.父节点
每个tag或字符串都有父节点即被包含在某个tag中。
(1).parent
通过 .parent 属性来获取某个元素的父节点;文档title的字符串也有父节点:

标签;文档的顶层节点比如的父节点是 BeautifulSoup 对象;BeautifulSoup 对象的 .parent 是None。

(2).parents
通过元素的 .parents 属性可以递归得到元素的所有父辈节点。
代码:
学习笔记之BeautifulSoup(2)——遍历文档树

运行结果:
学习笔记之BeautifulSoup(2)——遍历文档树

3.兄弟节点
同一个元素的子节点被称为兄弟节点.一段文档以标准格式输出时,兄弟节点有相同的缩进级别.在代码中也可以使用这种关系。
(1).next_sibling 和 .previous_sibling
在文档树中,使用 .next_sibling 和 .previous_sibling 属性来查询兄弟节点。
代码:
学习笔记之BeautifulSoup(2)——遍历文档树

运行结果:
学习笔记之BeautifulSoup(2)——遍历文档树

标签有 .next_sibling 属性,但是没有 .previous_sibling 属性,因为标签在同级节点中是第一个.同理,标签有 .previous_sibling 属性,却没有 .next_sibling 属性;字符串“text1”和“text2”不是兄弟节点,因为它们的父节点不同。
实际文档中的tag的 .next_sibling 和 .previous_sibling 属性通常是字符串或空白。
代码:
学习笔记之BeautifulSoup(2)——遍历文档树

运行结果:
学习笔记之BeautifulSoup(2)——遍历文档树

第一个a标签的 .next_sibling 结果不是第二个a标签,而是第一个a标签和第二个a标签之间的逗号和换行符,第二个a标签是逗号的 .next_sibling 属性。
(2).next_siblings 和 .previous_siblings
通过 .next_siblings 和 .previous_siblings 属性可以对当前节点的兄弟节点迭代输出。
代码:
学习笔记之BeautifulSoup(2)——遍历文档树

运行结果:
学习笔记之BeautifulSoup(2)——遍历文档树

4.回退和前进
HTML解析器把字符串转换成一连串的事件,Beautiful Soup提供了重现解析器初始化过程的方法。
(1).next_element 和 .previous_element
代码:
学习笔记之BeautifulSoup(2)——遍历文档树

运行结果:
学习笔记之BeautifulSoup(2)——遍历文档树

.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 的迭代器就可以向前或向后访问文档的解析内容,就好像文档正在被解析一样。
代码:
学习笔记之BeautifulSoup(2)——遍历文档树

运行结果:
学习笔记之BeautifulSoup(2)——遍历文档树