BeautifulSoup 遍历和获取

遍历文档树

直接子节点

要点:.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 属性

推荐阅读更多精彩内容