使用 beautifulsoup 提取两个 headers 之间的文本

Using beautifulsoup to extract text in spans between two headers

我正在尝试使用 BeautifulSoup 从演出指南中抓取一些文本,其中包含按流派列出的列表。我对此完全陌生,我发现我可以 return 一个流派列表和一个完整的演出标题列表,但当然我只想 return 与特定流派(然后转到下一个流派并选择其 gig-titles 等)演出指南的源代码如下:

<h3>indie</h3>
    <span class="gig-title"><a href="/gig/BandA">BandA</a></span> 
    <span class="gig-title"><a href="/gig/BandB">BandB</a></span> 
    <span class="gig-title"><a href="/gig/BandC">BandC</a></span> 

<h3>jazz</h3>
    <span class="gig-title"><a href="/gig/BandD">BandD</a></span> 
    <span class="gig-title"><a href="/gig/BandE">BandE</a></span>

我可以找到所有流派和 gig-titles 类似的东西:

genres = soup.find_all("h3")
for genre in genres:
    titles = soup.find_all("span","gig-title")
    for title in titles:
        gig = title.a.string

但是,我只想 return 文本:"BandA"、"BandB"、"BandC" - 这是两个 h3(流派)标签之间的文本,在移动之前进入下一个流派。

我该如何解决这个问题?

您可以使用findall()同时查找header和数据。然后只处理您需要的数据:

代码:

def get_genre_band(soup):
    genre = None
    for node in soup.findAll(['h3', 'span']):
        if node.name == 'h3':
            genre = node.text
        elif 'gig-title' in node.get('class', ''):
            yield genre, node.text

测试代码:

data = """
    <h3>indie</h3>
        <span class="gig-title"><a href="/gig/BandA">BandA</a></span> 
        <span class="gig-title"><a href="/gig/BandB">BandB</a></span> 
        <span class="gig-title"><a href="/gig/BandC">BandC</a></span> 

    <h3>jazz</h3>
        <span class="gig-title"><a href="/gig/BandD">BandD</a></span> 
        <span class="gig-title"><a href="/gig/BandE">BandE</a></span>
"""

from bs4 import BeautifulSoup
for g, b in get_genre_band(BeautifulSoup(data, 'lxml')):
    print("{} {}".format(g, b))

结果:

indie BandA
indie BandB
indie BandC
jazz BandD
jazz BandE