使用beautifulsoup在两个标题之间的跨度中提取文本

时间:2017-05-29 12:24:47

标签: python web-scraping beautifulsoup python-3.6

我试图使用BeautifulSoup从一个演出指南中删除一些按流派列表的文字。我对此完全陌生,我发现我可以返回一个类型列表和一个完整的演出列表列表,但当然我只想返回与特定类型相关的演出标题(和然后转到下一个类型并拿起它的演出标题等。)演出指南的源代码是这样的:

<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>

我可以找到所有类型和演出标题,例如:

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

但是,我只想回复文字:&#34; BandA&#34;,&#34; BandB&#34;,&#34; BandC&#34; - 这是两个h3(流派)标签之间的文本,然后再转到下一个类型。

我如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

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

代码:

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