【问题标题】:Using beautifulsoup to extract text in spans between two headers使用 beautifulsoup 提取两个标题之间的文本
【发布时间】:2017-05-30 04:47:15
【问题描述】:

我正在尝试使用 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

但是,我只想返回文本:“BandA”、“BandB”、“BandC”——这是两个 h3(流派)标签之间的文本,然后再转到下一个流派。

我该如何解决这个问题?

【问题讨论】:

    标签: python web-scraping beautifulsoup python-3.6


    【解决方案1】:

    您可以使用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
    

    【讨论】:

    • 谢谢!如果我使用示例数据,我发现这是可行的,但是当我实际打开网页以使用那里的数据时,我收到以下行的错误:节点 ['class'] 中的 elif 'gig-title':我可以如果我将 ['class'] 编辑为 (['class']) 或 ('class'),则摆脱此错误,但似乎什么也没发生。 (请注意,我使用的是 BeautifulSoup(data, 'html.parser') 而不是 'lxml' - 不确定这是否是问题的一部分?)
    • 感谢您的更新 - 这太棒了。现在,继续下一个问题!
    猜你喜欢
    • 1970-01-01
    • 2016-06-22
    • 2016-03-27
    • 1970-01-01
    • 1970-01-01
    • 2019-09-10
    • 2019-04-14
    • 2016-02-07
    • 2014-11-13
    相关资源
    最近更新 更多