Python和BS4 - 在一定次数后停止阅读

时间:2013-10-24 22:06:22

标签: python dictionary web-scraping beautifulsoup bs4

第一次使用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)

2 个答案:

答案 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