1

私は最近、yahoo NHL ページからスコアを取得するのを手伝ってもらいました。このページでは、チームと前述のスコアがそれぞれの方法で印刷されます。これが私のコードです:

from bs4 import BeautifulSoup
from urllib.request import urlopen

url = urlopen("http://sports.yahoo.com/nhl/scoreboard?d=2013-01-19")

content = url.read()

soup = BeautifulSoup(content)

def yahooscores():
    results = {}

    for table in soup.find_all('table', class_='scores'):
        for row in table.find_all('tr'):
            scores = []
            name = None
            for cell in row.find_all('td', class_='yspscores'):
                link = cell.find('a')
                if link:
                    name = link.text
                elif cell.text.isdigit():
                    scores.append(cell.text)
            if name is not None:
                results[name] = scores

    for name, scores in results.items():
        print ('%s: %s' % (name, ', '.join(scores)) + '.')

yahooscores()

さて、まず第一に、1 月の毎日のすべての値を取得するには、URL を絶えず変更する必要があるため、このようなものを関数に関連付けています。

ここでの問題は、スコアとチームのテキストをうまく印刷できる一方で、これを達成しようとしていることです。

Ottawa: 1, 1, 2.
Winnipeg: 1, 0, 0.

Pittsburgh: 2, 0, 1
Philadelphia: 0, 1, 0.

ほら、私のコードはそれをしません。私はそれを起こそうとしていましたが、プロセスを複雑にしているのは、テーブルがすべて同じクラスの「スコア」の下にあり、一見、それらの中で何か違うものを見つけることができないということです.

一言で言えば、チームを互いに正しく関連付け、間にスペースを設けて組織化することです。

4

2 に答える 2

0

問題は、テーブルをチームの単純なリストとして扱っていることです。スコアのリストではなく、それぞれに 2 つのチームが含まれています。

これを修正する明確な方法は、ページを解析する方法を変更してゲームをループし、ゲームごとに名前とスコアのペアのようなものを保存することです。


しかし、手っ取り早い解決策もあります。チームを整理しておくと、後からペアを組むことができます。Adictには固有の順序はありませんが、OrderedDict挿入の順序は維持されます。に変更results = {}するだけresults = collections.OrderedDictです。

(ただし、この dict で行う唯一のことがそのitems()の反復である場合、辞書が必要な理由がまったくわかりません。単に を実行しresults = []、 に置き換えresults[name] = scoresてから、の代わりにresults.append((name, scores))反復します。)resultsresults.items()

そして今、それらをペアで出力したい場合は…まあ、どんな iterable からでもとても簡単にペアに対するイテレータを作ることができます。例えば:

def pairs(iterable):
    return zip(*[iter(iterable)]*2)

for (name1, score1), (name2, score2) in pairs(results.items()):
    print ('%s: %s' % (n1, ', '.join(s1)) + '.')
    print ('%s: %s' % (n2, ', '.join(s2)) + '.')
    print

または、それが何を意味するのか理解できない場合は、次のようなハックもうまく機能します。

pair_done = False
for name, scores in results.items():
    print ('%s: %s' % (name, ', '.join(scores)) + '.')
    if pair_done:
        print
    pair_done = not pair_done

… また:

for i, (name, scores) in enumerate(results.items()):
    print ('%s: %s' % (name, ', '.join(scores)) + '.')
    if i % 2:
        print
于 2013-08-21T01:40:47.970 に答える