我正在一个项目中收集音乐家/团体/艺术家的名字,然后我开始在此网站上工作:https://www.canzoni.it/artisti/lettera/a(具有简单的html结构)。我的目标是收集本节中从A到Z的所有名称。我想创建一个函数并进行重新构造。这是代码:
def crawl_canzoni_it(url, base = 'https://www.canzoni.it'):
links=[]
artists=[]
r = requests.get(base+url).text
obj = BeautifulSoup(r, "html.parser")
for i in obj.select('.ul_freccia li'):
for link in i.findAll('a'):
links.append(link['href'])
for i in obj.select('.ul_freccia li'):
for link in i.findAll('a'):
artists.append(link.text)
for i in obj.findAll('a'):
if i.has_attr('title'):
if i['title'] == 'Vai alla pagina Successiva':
print(base+i['href'])
crawl_canzoni_it(i['href'])
else:
pass
else: pass
return artists, links
问题之一是返回的两个列表包含名称的first页(即https://www.canzoni.it/artisti/lettera/a/1,而不是最后一个(https://www.canzoni.it/artisti/lettera/a/8),我不明白为什么。
对于第二个问题,我知道这样做,我的程序没有将我需要的全部存储在“链接”和“艺术家”列表中,因为在每个循环中,它们都会重新初始化,但是我不知道如何最后获取完整列表。
关于第二个问题。在每个递归调用中,您的链接和艺术家都被重新初始化。因此,在外部函数中,您可以创建其他列表,而在函数末尾,可以将该链接附加到其上。