第一次使用Python 3用户并开始了解它。作为练习,我试图从http://rateyourmusic.com/customchart读取表格(使用BeautifulSoup4)并将Rank,Artist,Album和Year转换为字典。我想把字典放到MySQL数据库中。我能够从表中获取所有信息并将它们放入变量中,然后将其放入字典中,但我有一点问题。表中的最后一个条目是广告,因此它不跟随其上方的其他表行。我想只读取表格的前100行。我在尝试阅读广告行时遇到错误。
这是我的代码。请任何帮助都会很棒。此外,如果您发现我的代码中有任何错误或我如何做得更好,请告诉我。
所以它打印字典并且一切看起来都不错,但是在打印出所有字典之后它会给我一个错误。
from bs4 import BeautifulSoup
from urllib.request import Request, urlopen
url = "http://rateyourmusic.com/customchart"
req = Request(url, headers={'User-Agent': 'Mozilla/5.0'})
soup = BeautifulSoup(urlopen(req))
table = soup.find("table", {"class" : "mbgen"})
totalList = []
for row in table.findAll("tr"):
cells = row.findAll("td")
rank = int(cells[0].find(class_="ooookiig").text)
artist = cells[2].find(class_="artist").text
album = cells[2].find(class_="album").text
year = cells[2].find(class_="mediumg").text
year = int(year[1:5])
chartData = {"Rank":rank, "Artist":artist, "Album":album, "Year":year}
totalList.append(chartData)
print(chartData)
答案 0 :(得分:0)
您可以使用计数器进行迭代并在计数器达到100时立即停止,但我不太喜欢,代码将不再有用,因为他们决定将元素数量增加到200,例如。我会使用一个简单的try
块,如下所示:
for row in table.findAll("tr"):
try:
cells = row.findAll("td")
rank = int(cells[0].find(class_="ooookiig").text)
artist = cells[2].find(class_="artist").text
album = cells[2].find(class_="album").text
year = cells[2].find(class_="mediumg").text
year = int(year[1:5])
chartData = {"Rank":rank, "Artist":artist, "Album":album, "Year":year}
totalList.append(chartData)
print(chartData)
except AttributeError:
pass
答案 1 :(得分:0)
那是因为解析器无法找到该项目。
来自BS4 documentation:
如果find_all()找不到任何内容,则返回一个空列表。如果find()找不到任何内容,则返回None
您可以使用try块,但就个人而言,我更喜欢手动检查:
for rownumber, row in enumerate(table.findAll('tr')):
if rownumber < 100:
#do something