遍历文档树
直接子节点
要点:.contents .children 属性
.contents
tag 的 .content 属性可以将tag的子节点以列表的方式输出
#["<meta charset='utf-8'/>","<title>The Dormouse's story</title>"]
输出方式为列表,我们可以用列表索引来获取它的某一个元素
print(soup.head.contents[0])
#<meta charset="utf-8"/>
.children
它返回的不是一个 list,不过我们可以通过遍历获取所有子节点。
我们打印输出 .children 看一下,可以发现它是一个 list 生成器对象
print(soup.head.children)
#<list_iterator object at 0x105c1cf28>
获取里面的内容
for child in soup.body.children:
print(child)
所有子孙节点
知识点:.descendants 属性
.descendants
.contents 和 .children 属性仅包含tag的直接子节点,.descendants 属性可以对所有tag的子孙节点进行递归循环,和 children类似,我们也需要遍历获取其中的内容。
节点内容
知识点:.string 属性
多个内容
知识点: .strings .stripped_strings 属性
.strings
获取多个内容,不过需要遍历获取,比如下面的例子
.stripped_strings
输出的字符串中可能包含了很多空格或空行,使用 .stripped_strings 可以去除多余空白内容
父节点
知识点: .parent 属性
全部父节点
知识点:.parents 属性
通过元素的 .parents 属性可以递归得到元素的所有父辈节点,例如
content = soup.head.title.string
for parent in content.parents:
print parent.name
兄弟节点
知识点:.next_sibling .previous_sibling 属性
兄弟节点可以理解为和本节点处在统一级的节点,.next_sibling 属性获取了该节点的下一个兄弟节点,.previous_sibling 则与之相反,如果节点不存在,则返回 None
注意:实际文档中的tag的 .next_sibling 和 .previous_sibling 属性通常是字符串或空白,因为空白或者换行也可以被视作一个节点,所以得到的结果可能是空白或者换行
全部兄弟节点
知识点:.next_siblings .previous_siblings 属性
通过 .next_siblings 和 .previous_siblings 属性可以对当前节点的兄弟节点迭代输出
for sibling in soup.a.next_siblings:
print(repr(sibling))
前后节点
知识点:.next_element .previous_element 属性