【问题标题】:Scraping song lyrics with beautifulsoup用beautifulsoup刮歌词
【发布时间】:2021-09-02 17:26:57
【问题描述】:

使用 Genius API,我获得了歌词页面的歌曲网址。我现在想使用beautifulsoup4 进行网络爬网;但是,我遇到了一个错误。代码如下:

from bs4 import BeautifulSoup
import requests

def scrap_song_url(url):
    page = requests.get(url)
    html = BeautifulSoup(page.text, 'html.parser')
    lyrics = html.find('div', class_='lyrics').get_text()

    return lyrics

在这里,我正在查看歌词页面的 html。举个例子,看看这个特定的 url:https://genius.com/Acceptance-permanent-lyrics。通过 html 查找,歌词似乎包含在 div 下,类为 'lyrics'

但是,尝试使用 html.find 查找此对象会返回 NoneType 对象,因此 .get_text() 会引发错误。我认为这意味着,由于某种原因,没有找到 html 标记(或任何你称之为的,我真的不知道 html)。如何从给定的歌词 url 中获取 div 类 'lyrics' 的歌词?

【问题讨论】:

    标签: python html beautifulsoup


    【解决方案1】:

    有一个受支持且看起来很酷的 Genius API Python 包装器:LyricsGenius。你应该试试看。使用 pip 可以轻松安装:pip install lyricsgenius

    从它的文档来看,收集歌词看起来要容易得多:

    from lyricsgenius import Genius
    
    genius = Genius(token)
    genius.search_artist('Andy Shauf')
    artist.save_lyrics()
    

    【讨论】:

    • 这比我的解决方案更聪明!可以的时候总是用别人的努力哈哈
    • 是的,我们为什么要重新发明轮子? :)
    • 帮帮我,即使我传递了正确的令牌,它也会显示“TypeError:InvalidToken”??!!请帮助meeee
    【解决方案2】:

    嗯,我不认为那是歌词所在的地方。对于那个特定的页面,我做到了:

    lyrics = html.select("div[class*=Lyrics__Container]")
    

    然后得到了歌词(还有一堆其他的 HTMl 混在一起)。有很多清洁工作要做。 '*' 让您获得所有以 Lyrics__C​​ontainer 开头的类开始,因为我认为后面有一串数字和字母可能会改变。

    【讨论】:

      【解决方案3】:

      在首先使用attribute 选择器分离出主句/合唱部分之后,您可以使用stripped_strings 选择单独的行。在语法的外部有一些列表取消嵌套。

      import requests
      from bs4 import BeautifulSoup as bs
      from pprint import pprint
      
      r = requests.get('https://genius.com/Acceptance-permanent-lyrics')
      soup = bs(r.content, 'lxml')
      pprint([i for j in [[line for line in verse.stripped_strings] for verse in soup.select('[data-scrolltrigger-pin]')] for i in j])
      
      # pprint('\n'.join([i for j in [[line for line in verse.stripped_strings] for verse in soup.select('[data-scrolltrigger-pin]')] for i in j]))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-05
        • 1970-01-01
        • 2019-09-23
        • 2021-09-15
        • 2020-07-05
        • 1970-01-01
        相关资源
        最近更新 更多