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

时间:2015-01-01 09:50:33

标签: python beautifulsoup

这是我的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>&nbsp;</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可以解决此问题,但由于某种原因会返回以下错误:

TypeError: 'NoneType' object is not callable

我一直在尝试对这个答案进行修改:Find next siblings until a certain one using beautifulsoup但是缺少一个主要标签让我很困惑。

2 个答案:

答案 0 :(得分:2)

找到第一个标题并迭代.next_siblings,直到您点击另一个标题:

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)

答案 1 :(得分:1)

我不明白你为什么要通过soup作为论据,但你不能使用它。

如果你使用正确的汤实例,你不应该得到那个错误。 findAllNext(h4)返回<h4>Header1</h4><h4>Header2</h4>,在每个文件上都应用nextSibling会返回文本兄弟,

block of text that I want.

')

在你的情况下。