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