在标签之间获取多个文本块

Getting multiple blocks of text between tags

这是我的 HTML:

<div class="left_panel">
    <h4>Header1</h4>
      block of text that I want.            
    <br />
    <br />
      another block of text that I want.
    <br />
    <br />
      still more text that I want.
    <br />
    <br />
      <p> </p>
    <h4>Header2</h4>

文本块的数量是可变的,Header1是一致的,Header2不是。

我使用以下代码成功提取了第一段文本:

def get_summary (soup):
raw = soup.find('div',{"class":"left_panel"})
for h4 in raw.findAllNext('h4'):
    following = h4.nextSibling
    return following

但是我需要位于两个 h4 标签之间的所有项目,我希望使用 h4.nextSiblings 可以解决这个问题,但由于某些原因 returns 以下错误:

TypeError: 'NoneType' object is not callable

我一直在尝试这个答案的变体:Find next siblings until a certain one using beautifulsoup 但是缺少前导标签让我感到困惑。

我不明白你为什么将 soup 作为参数传递但你不使用它。

如果您使用正确的 soup 实例,则不会出现该错误。 findAllNext(h4) returns <h4>Header1</h4><h4>Header2</h4>,对每个 returns 文本同级应用 nextSibling,即

block of text that I want.

')

你的情况。

找到第一个 header 并遍历 .next_siblings 直到找到另一个 header:

from bs4 import BeautifulSoup

data = """
<div class="left_panel">
    <h4>Header1</h4>
      block of text that I want.
    <br />
    <br />
      another block of text that I want.
    <br />
    <br />
      still more text that I want.
    <br />
    <br />
      <p>&nbsp;</p>
    <h4>Header2</h4>
</div>
"""

soup = BeautifulSoup(data)
header1 = soup.find('h4', text='Header1')
for item in header1.next_siblings:
    if getattr(item, 'name') == 'h4' and item.text == 'Header2':
        break

    print item

更新(收集两个 h4 标签之间的文本):

texts = []
for item in header1.next_siblings:
    if getattr(item, 'name') == 'h4' and item.text == 'Header2':
        break

    try:
        texts.append(item.text)
    except AttributeError:
        texts.append(item)

print ''.join(texts)