接上篇:
5. 遍历文档树
(1)直接子节点
Tag的.content属性可以将tag的子节点以列表的形式输出,用例:
输出:
Tag的.children属性可以将tag的所有子节点返回,返回形式不是一个list,而是一个list生成器,需要通过遍历来获取所需的子节点,用例:
输出:
(2)所有子孙节点
.children和.content返回的仅仅是tag的直接子节点,而.descendants可以对所有tag的子孙节点进行递归循环遍历,用例:
输出:
从输出结果来看,所有节点都被打印出来,首先是最外层的html标签,接着是head标签,一层层的剥离。
(3)节点内容
如果tag只有一个 NavigableString 类型子节点,那么这个tag可以使用 .string 得到子节点。如果一个tag仅有一个子节点,那么这个tag也可以使用 .string 方法,输出结果与当前唯一子节点的 .string 结果相同。
如果tag包含了多个子节点,tag就无法确定string 方法应该调用哪个子节点的内容, .string 的输出结果是 None,用例:
输出:
(4)多个内容
.strings属性可以获得多个内容,通过遍历实现,用例:
输出:
输出的字符串中可能包含了很多空格或空行,使用 .stripped_strings 可以去除多余空白内容,用例:
输出:
(5)父节点
通过元素的 .parents属性可以得到元素的所有父节点,用例:
输出:
(6)所有父节点
通过元素的 .parents 属性可以递归得到元素的所有父辈节点,用例:
输出:
(7)兄弟节点
兄弟节点可以理解为和本节点处在统一级的节点,.next_sibling 属性获取了该节点的下一个兄弟节点,.previous_sibling 则与之相反,如果节点不存在,则返回 None
注意:实际文档中的tag的 .next_sibling 和 .previous_sibling 属性通常是字符串或空白,因为空白或者换行也可以被视作一个节点,所以得到的结果可能是空白或者换行,用例:
输出都是空白,但是下面用例:
输出:
(8)全部兄弟节点
通过 .next_siblings 和 .previous_siblings 属性可以对当前节点的兄弟节点迭代输出,用例:
输出:
下节待续......