在 BeautifulSoup4、Python3 中,如何停止在找到的标签内递归?

In BeautifulSoup4, Python3, How to stop recursing inside a found tag?

我的 html 文件看起来像:

<html>
<body>
 <font color="#151B54">
     outer font
   <font color="#512222">
       inner font
   </font>
 </font>
 <p>
     <font color="#512222">
       sibling font
     </font>
 </p>
</body>
</html>

我想提取 'font' 标签之间的所有文本。预期输出:

outer font
inner font
sibling font

我试过的是:

  1. 使用文字

    soup = BeautifulSoup(htmlText)
    for i in soup.body.find_all('font'):
        print(i.text) 
    

    给我回复:

    outer font
    inner font
    inner font
    sibling font
    
  2. 使用字符串

    soup = BeautifulSoup(htmlText)
    for i in soup.body.find_all('font')
        print(i.string)
    

    遗漏了一些文字:

    None
    inner font
    sibling font
    

如何获得所需的输出?

更新

html文档只是我举的一个例子来说明情况。在我的一些文档中,包含 'sibling font' 的 'font' 标签不一定总是在 'p' 标签内。也可以有多个 'font' 标签嵌套在各种其他标签中。所以,我需要一个通用的解决方案。

您可以检查父项是否也是 font 标签。

print([node.text for node in soup.find_all('font') if node.parent.name != "font"])
for node in soup.findAll('font'):    
    inner_text = [element for element in node if isinstance(element, NavigableString)]
    print (''.join(inner_text))

outer font  
inner font 
sibling font