我试图从Billboard排名前100位获得歌曲的标题.图片是他们的html脚本.
我写了这段代码:
from bs4 import BeautifulSoup import urllib.request url= 'http://www.billboard.com/charts/year-end/2015/hot-100-songs' page = urllib.request.urlopen(url) soup = BeautifulSoup(page.read(), "html.parser") songtitle = soup.find("div", {"class": "row-title"}).h2.contents print(songtitle)
它检索了第一个标题"UPTOWN FUNK!"
当我使用find_all
它时给我错误:
line 6, insongtitle = soup.find_all("div", {"class": "row-title"}).h2.contents AttributeError: 'ResultSet' object has no attribute 'h2'
为什么它给我一个错误,而不是给我所有的标题?在本网站上使用chrome Shift J in chrome可以找到完整的html脚本:http://www.billboard.com/charts/year-end/2015/hot-100-songs
.find_all()
返回一个ResultSet
基本上是Tag
实例列表的对象- 它没有find()
方法.您需要循环结果find_all()
并调用find()
每个标记:
for item in soup.find_all("div", {"class": "row-title"}): songtitle = item.h2.contents print(songtitle)
或者,创建一个CSS选择器:
for title in soup.select("div.row-title h2"): print(title.get_text())
顺便说一下,文档中包含了这个问题:
AttributeError: 'ResultSet' object has no attribute 'foo'
- 这通常是因为您希望find_all()
返回单个标记或字符串.但是find_all()
返回一个标签和字符串列表 - 一个ResultSet
对象.您需要遍历列表并查看.foo
每个列表 .或者,如果您真的只想要一个结果,则需要使用find()
而不是find_all()
.