在BeautifulSoup4,Python3中,如何阻止在找到的标记内进行递归?

时间:2015-05-22 17:49:39

标签: python python-3.x beautifulsoup

我的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
    
  3. 如何获得所需的输出?

    更新

    html文档只是我用来解释这种情况的一个例子。在我的一些文档中,包含'兄弟字体'的'font'标签不一定总是在'p'标签内。在其他各种标签中也可以嵌套多个“font”标签。所以,我需要一个通用的解决方案。

2 个答案:

答案 0 :(得分:2)

您可以检查父级是否也是font标记。

print([node.text for node in soup.find_all('font') if node.parent.name != "font"])

答案 1 :(得分:0)

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