美丽的汤find()找不到类

时间:2019-10-05 21:13:05

标签: python html web-scraping beautifulsoup

我有代码尝试将所有html内容拉入tracklist容器中,该列表应包含88首歌曲。信息肯定在那里(我打印了汤要检查),所以我不确定为什么前30个react-contextmenu-wrapper之后的所有内容都会丢失。

from bs4 import BeautifulSoup
from urllib.request import urlopen
import re


spotify = 'https://open.spotify.com/playlist/3vSFv2hZICtgyBYYK6zqrP'
html = urlopen(spotify)
soup = BeautifulSoup(html, "html5lib")

main = soup.find(class_ = 'tracklist-container')
print(main)

感谢您的帮助。 打印的当前输出如下:

                  1.
              </div></div><div class="tracklist-col name"><div class="top-align track-name-wrapper"><span class="track-name" dir="auto">Move On - Teen Daze Remix</span><span class="artists-albums"><a href="/artist/3HrczLBDJXJu6dJWEMbKHa" tabindex="-1"><span dir="auto">Garden City Movement</span></a>     • <a href="/album/4p8FxnuYzykCcN7xbjA9jq" tabindex="-1"><span dir="auto">Entertainment</span></a></span></div></div><div class="tracklist-col explicit"></div><div class="tracklist-col duration"><div class="top-align"><span class="total-duration">5:11</span><span class="preview-duration">0:30</span></div></div><div class="progress-bar-outer"><div class="progress-bar"></div></div></li><li class="tracklist-row js-track-row tracklist-row--track track-has-preview" data-position="2" role="button" tabindex="0"><div class="tracklist-col position-outer"><div class="play-pause top-align"><svg aria-label="Play" class="svg-play" role="button"><use xlink:href="#icon-play" xmlns:xlink="http://www.w3.org/1999/xlink"></use></svg><svg aria-label="Pause" class="svg-pause" role="button"><use xlink:href="#icon-pause" xmlns:xlink="http://www.w3.org/1999/xlink"></use></svg></div><div class="tracklist-col__track-number position top-align">
                  2.
              </div></div><div class="tracklist-col name"><div class="top-align track-name-wrapper"><span class="track-name" dir="auto">Flicker</span><span class="artists-albums"><a href="/artist/4qpWUfUAeI34HzvCORn1ze" tabindex="-1"><span dir="auto">Forhill</span></a>     • <a href="/album/0gfz1Tbst40swwL357cRqG" tabindex="-1"><span dir="auto">Flicker</span></a></span></div></div><div class="tracklist-col explicit"></div><div class="tracklist-col duration"><div class="top-align"><span class="total-duration">3:45</span><span class="preview-duration">0:30</span></div></div><div class="progress-bar-outer"><div class="progress-bar"></div></div></li><li class="tracklist-row js-track-row tracklist-row--track track-has-preview" data-position="3" role="button" tabindex="0"><div class="tracklist-col position-outer"><div class="play-pause top-align"><svg aria-label="Play" class="svg-play" role="button"><use xlink:href="#icon-play" xmlns:xlink="http://www.w3.org/1999/xlink"></use></svg><svg aria-label="Pause" class="svg-pause" role="button"><use xlink:href="#icon-pause" xmlns:xlink="http://www.w3.org/1999/xlink"></use></svg></div><div class="tracklist-col__track-number position top-align">

...

                  30.
              </div></div><div class="tracklist-col name"><div class="top-align track-name-wrapper"><span class="track-name" dir="auto">Trapdoor</span><span class="artists-albums"><a href="/artist/3nqTFzjmi1LLM6pn0TRMv8" tabindex="-1"><span dir="auto">Eagle Eyed Tiger</span></a>     • <a href="/album/48Q8Jgk1x4wiHWecV4nlz6" tabindex="-1"><span dir="auto">Future or Past</span></a></span></div></div><div class="tracklist-col explicit"></div><div class="tracklist-col duration"><div class="top-align"><span class="total-duration">4:14</span><span class="preview-duration">0:30</span></div></div><div class="progress-bar-outer"><div class="progress-bar"></div></div></li></ol><button class="link js-action-button" data-track-type="view-all-button">View all on Spotify</button></div>

最后输入应该是第88位。感觉好像我的搜索结果被截断了。

3 个答案:

答案 0 :(得分:1)

由于您似乎走在正确的道路上,因此我并未尝试解决全部问题,而是尝试向您提供可能有用的提示:进行动态网页抓取

为什么硒?美丽汤还不够吗?

使用Python进行网页抓取通常只需要使用Beautiful Soup即可达到目标。 Beautiful Soup是一个非常强大的库,它通过遍历DOM(文档对象模型)使Web抓取更容易实现。但是它仅执行静态刮擦。静态抓取会忽略JavaScript。它无需浏览器即可从服务器获取网页。您将获得在“查看页面源代码”中看到的内容,然后对其进行切片和切块。如果您要查找的数据仅在“查看页面源”中可用,则无需再进行任何操作。但是,如果您需要在单击JavaScript链接时呈现的组件中存在的数据,则可以进行动态抓取。 Beautiful Soup和Selenium的结合将完成动态刮削工作。 Selenium通过python自动实现Web浏览器的交互。因此,可以通过使用Selenium自动执行按钮单击来使JavaScript链接呈现的数据可用,然后可以由Beautiful Soup提取。” https://medium.com/ymedialabs-innovation/web-scraping-using-beautiful-soup-and-selenium-for-dynamic-page-2f8ad15efe25

这是我在DOM中的30首歌曲的结尾处看到的内容,它指向一个按钮:

    </li>
   </ol>
   <button class="link js-action-button" data-track-type="view-all-button">
    View all on Spotify
   </button>
  </div>

答案 1 :(得分:0)

这是因为您在做

main = soup.find(class_ = 'tracklist-container')

“ tracklist-container”类仅包含这30个项目, 我不确定您要完成什么,但是如果您想 后来发生什么了,然后尝试解析该类。

换句话说,该课程包含30首歌曲,我访问了该网站并发现了30首歌曲,因此它可能仅适用于已登录的用户。

答案 2 :(得分:0)

响应中的所有内容都位于 script 标记内。

您可以在此处看到相关javascript对象的开头:

enter image description here

我将对所需的字符串进行正则表达式并使用json库进行解析。


Py:

import requests, re, json

r = s.get('https://open.spotify.com/playlist/3vSFv2hZICtgyBYYK6zqrP')
p = re.compile(r'Spotify\.Entity = (.*?);')
data = json.loads(p.findall(r.text)[0])
print(len(data['tracks']['items']))