为何BeautifulSoup无法提取div中的全部文本?
解决Genius歌词爬取不完整的问题
问题出在你只用了soup.find()——这个方法只会返回第一个匹配到的Lyrics__Container开头的div,但Genius网页里歌词是被拆分到多个同类型的div中的,所以你只拿到了前半部分。
把代码里的find改成find_all,然后遍历所有匹配的div,把文本拼接起来就能拿到完整歌词了:
from bs4 import BeautifulSoup import re import requests song_api_path = '/Taylor-swift-cardigan-lyrics' page_url = "http://genius.com" + song_api_path page = requests.get(page_url) soup = BeautifulSoup(page.text, "html.parser") # 用find_all获取所有匹配的歌词div divs = soup.find_all("div", class_=lambda value: value and re.search(r'^Lyrics__Container', value)) # 遍历所有div,拼接文本 all_text = '\n'.join([div.get_text(separator='\n') for div in divs]) print(all_text)
运行这段代码就能输出完整的《cardigan》歌词了。另外注意,Genius可能会有反爬机制,频繁请求可能会被限制,必要时可以给requests加个headers模拟浏览器请求。
内容的提问来源于stack exchange,提问作者dasousa
相关产品推荐
相关产品推荐

