2013-10-24 4 views
0

Первый пользователь Python 3 и начинает его повесить. В качестве упражнения я пытаюсь прочитать таблицу (с BeautifulSoup4) от http://rateyourmusic.com/customchart и преобразовать Ранг, Исполнитель, Альбом и Год в словарь. Я хочу поместить словарь в базу данных MySQL. Я смог получить всю информацию из таблицы и поместить ее в переменные, которые затем помещаю в словарь, но у меня небольшая проблема. Последняя запись в таблице - это реклама, поэтому она не следует за другими строками таблицы над ней. Я хочу только прочитать первые 100 строк таблицы. При попытке прочитать строку рекламы я получаю сообщение об ошибке.Python и BS4 - прекратить чтение после определенного количества раз

Вот мой код. Пожалуйста, любая помощь будет замечательной. Также, если вы видите какие-либо ошибки в моем коде или как я мог бы сделать что-то лучше, пожалуйста, дайте мне знать.

Так что это печать словарей, и все выглядит хорошо, но это дает мне ошибку после распечатки всех их.

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

Можете ли вы предоставить полный отслеживающий? – aIKid

+0

Traceback (последний последний звонок): Файл «C: \ Programming \ RateYourMusicCrawler \ AlbumInfoCrawler.py», строка 21, в rank = int (ячейки [0] .find (класс _ = "ooookiig")) AttributeError: объект «NoneType» не имеет атрибута «текст» –

ответ

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 
+0

Удивительный! Большое спасибо PepperoniPizza !!! Решила мою проблему мгновенно. Я еще не привык ловить ошибки. Еще раз спасибо!!! –

0

Это потому, что анализатор не может найти элемент.

От BS4 documentation:

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 
Смежные вопросы