【问题标题】:Getting multiple blocks of text between tags在标签之间获取多个文本块
【发布时间】:2015-01-01 09:50:32
【问题描述】:

这是我的 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,但缺少前导标签让我感到困惑。

【问题讨论】:

    标签: python beautifulsoup


    【解决方案1】:

    找到第一个标头并遍历.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)
    

    【讨论】:

    • 感谢 Alecxe,效果很好。将这些字符串组合成一个健全的项目的最佳方法是什么?我目前正在使用 append 将它们添加到列表中,这似乎有点愚蠢。
    • @woodbine 请查看更新。基本上,它与您所说的相同 - 维护文本列表。希望对您有所帮助。
    • 感谢 Alecxe,非常感谢。
    【解决方案2】:

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

    如果您使用正确的汤实例,则不应出现该错误。 findAllNext(h4) 返回 &lt;h4&gt;Header1&lt;/h4&gt;&lt;h4&gt;Header2&lt;/h4&gt;,对每个应用 nextSibling 返回文本兄弟,它们是

    block of text that I want.
    

    ')
    

    在你的情况下。

    【讨论】:

    • 对不起,我的错,我在原始代码中调用了tender_soup,但使用'soup'来简化它。我忘记从后续通话中删除“tender_”。已调整。
    猜你喜欢
    • 2011-06-01
    • 2016-12-25
    • 1970-01-01
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多