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 に答える