我试图使用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(流派)标签之间的文本,然后再转到下一个类型。
我如何解决这个问题?
答案 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