我目前正在使用Python 2.7.6中的Beautiful Soup 4进行实验
现在,我有一个简单的脚本来刮掉Soundcloud.com。我试图在页面上打印出按钮标签的数量,但我没有得到我期望的答案。
from bs4 import BeautifulSoup
import requests
page = requests.get('http://soundcloud.com/sondersc/waterfalls-sonder')
data = page.text
soup = BeautifulSoup(data)
buttons = soup.findAll('button')
print len(buttons)
当我运行它时,我得到输出
num buttons = 0
这让我很困惑。我知道这个按钮标签存在于这个页面上所以它不应该返回0.在检查波形下面的按钮元素时,我发现这些......
<button class="sc-button sc-button-like sc-button-medium sc-button-responsive" tabindex="0" title="Like">Like</button>
<button class="sc-button sc-button-medium sc-button-responsive sc-button-addtoset" tabindex="0" title="Add to playlist">Add to playlist</button>
<button class="sc-button sc-button-medium sc-button-responsive sc-button-addtogroup" tabindex="0" title="Add to group">Add to group</button>
<button class="sc-button sc-button-share sc-button-medium sc-button-responsive" title="Share" tabindex="0">Share</button>
起初我认为我试图找到按钮元素的方式不正确。但是,如果我修改我的代码以刮取任意youtube页面......
page = requests.get('http://www.youtube.com/watch?v=UiyDmqO59QE')
然后我得到输出
num buttons = 37
这意味着soup.findAll('button')
正在做他们想要做的事情,而不是声音云。
我也尝试过指定我想要的确切按钮,希望获得1的返回结果
buttons = soup.findAll('button', class_='sc-button sc-button-like sc-button-medium sc-button-responsive')
print 'num buttons =', len(buttons)
但它仍然返回0.
我有点难过这个。任何人都可以解释为什么会这样吗?
答案 0 :(得分:1)
你无法获得按钮的原因是你得到的html中没有button
个标签:
>>> import requests
>>> page = requests.get('http://soundcloud.com/sondersc/waterfalls-sonder')
>>> data = page.text
>>> '<button' in data
False
这意味着形成页面涉及更多:AJAX请求,javascript函数调用等
另请注意,soundcloud
提供API - 无需抓取网站的HTML网页。 Soundcloud API周围还有一个python wrapper。
另外,请注意网页抓取,研究Terms of Use
:
您不得采用刮擦或类似技术进行聚合, 重新利用,重新发布或以其他方式使用任何内容。