Python和BS4在一定时间后停止读取

2024-09-28 01:33:22 发布

您现在位置:Python中文网/ 问答频道 /正文

第一次使用python3并开始掌握窍门。作为练习,我尝试从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)

Tags: textcomhttpalbum字典artisttablefind
2条回答

你可以用一个计数器迭代,当计数器达到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

这是因为解析器找不到该项。在

来自BS4documentation

If find_all() can’t find anything, it returns an empty list. If find() can’t find anything, it returns None

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

for rownumber, row in enumerate(table.findAll('tr')):
    if rownumber < 100:
        #do something

相关问题 更多 >

    热门问题