0

第一次使用 Python 3 并开始掌握它。作为一个练习,我试图从http://rateyourmusic.com/customchart读取表格(使用 BeautifulSoup4) ,并将排名、艺术家、专辑和年份转换为字典。然后我想将字典放入 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)
4

2 回答 2

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
于 2013-10-24T22:35:09.577 回答
0

那是因为解析器找不到该项目。

来自 BS4文档

如果 find_all() 找不到任何东西,它会返回一个空列表。如果 find() 找不到任何东西,则返回 None

您可以使用 try 块,但就个人而言,我更喜欢手动检查:

for rownumber, row in enumerate(table.findAll('tr')):
    if rownumber < 100:
        #do something
于 2013-10-24T22:35:17.723 回答