如何使用BeautifulSoup从一个级别获取文本?

时间:2014-09-17 10:37:33

标签: python beautifulsoup

我有一些网页,我想按级别对所有文本内容进行排序。 但我不知道会有什么标签。

html = BeautifulSoup("<a><b>text1</b><b>text2</b></a><c>text3</c>")
print(html.prettify())

#<html>
#  <body>
#      <a>
#         <b>
#           text1
#         </b>
#         <b>
#           text2
#         </b>
#      </a>
#      <c>
#         text3
#      </c>
#  </body>
#</html>

如何使用bs4获取所有文本块?

level1 = ['text3']
level2 = ['text1', 'text2']

依旧......结果的结构可能不同。

感谢您的回复!

1 个答案:

答案 0 :(得分:1)

解决此问题的方法之一是使用算法搜索树(例如深度优先搜索)

from bs4 import NavigableString

def dfs(tree, level):
    for node in tree.children:
        if isinstance(node, NavigableString):
            if not node.string == '':
                print node.string, level
            return
        dfs(node, level + 1)

dfs(html, 0)

会打印

# text1 4
# text2 4
# text3 3

因此,如果有必要,我们可以制作一个包装器将结果保存到字典中。例如,像这样:

from bs4 import NavigableString

def dfs(tree):
    level = 0
    levDic = {}

    dfs1(tree, level, levDic)
    return levDic


def dfs1(tree, level, levDic):
    for node in tree.children:
        if isinstance(node, NavigableString):
            if not node.string == '':
                if level in levDic.keys():
                    levDic[level].append(node.string)
                else:
                    levDic[level] = [node.string]
            return
        dfs1(node, level + 1, levDic)
    return

print dfs(html)
# {3: [u'text3'], 4: [u'text1', u'text2']}