1

http://www.nfl.com/scoresから情報を取得しようとしています(特に、ゲームが終了したときに、コンピューターが記録を停止できるようにします)。HTMLは簡単にダウンロードでき、標準への準拠について次のように主張しています。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

だが

  1. Expatで解析しようとすると、エラーが発生しますnot well-formed (invalid token)

  2. W3Cのオンライン検証サービスは、399のエラーと121の警告を報告します。

  3. tidyオプションを指定してLinuxシステムでHTMLtidy(ちょうど呼ばれる)を実行しようとしまし-xmlたが、tidyは56の警告と117のエラーを報告し、適切なXMLファイルを回復できません。エラーは次のようになります。

    line 409 column 122 - Warning: unescaped & or unknown entity "&role"
    ...
    line 409 column 172 - Warning: unescaped & or unknown entity "&tabSeq"
    ...
    line 1208 column 65 - Error: unexpected </td> in <br>
    line 1209 column 57 - Error: unexpected </tr> in <br>
    line 1210 column 49 - Error: unexpected </table> in <br>
    

    しかし、入力を確認すると、「不明なエンティティ」は適切に引用されたURLの一部であるように見えるため、二重引用符がどこかに欠落しているかどうかはわかりません。

Firefoxとw3mの両方が妥当なものを表示するので、このようなものを解析できる ものがあることを私は知っています。Expatで解析できるように、非準拠のHTMLを修正するツールはどれですか?

4

3 に答える 3

4

彼らはスコアボックスである種のJavascriptを使用しているので、もっと巧妙なトリックをプレイする必要があります(私の改行):

/* box of awesome */
// iscurrentweek ? true;
(new nfl.scores.Game('2009112905','54635',{state:'pre',container:'scorebox-2009112905',
wrapper:'sb-wrapper-2009112905',template:($('scorebox-2009112905').innerHTML),homeabbr:'NYJ',
awayabbr:'CAR'}));

しかし、あなたの質問に答えるために、BeautifulSoupはそれを(一見)うまく解析します:

fp = urlopen("http://www.nfl.com/scores")
data = ""
while 1:
    r = fp.read()
    if not r:
        break
    data += r
fp.close()

soup = BeautifulSoup(data)
print soup.contents[2].contents[1].contents[1]

出力:

<title>NFL Scores: 2009 - Week 12</title>

私の意見では、 YahooのNFLスコアボードをこすり取るほうが簡単かもしれません...実際、試してみてください。


編集: BeautifulSoupを学ぶための言い訳としてあなたの質問を使用しました。アレックス・マルテッリはその賞賛を歌っていたので、試してみる価値があると思いました-男、私は感銘を受けました。

とにかく、Yahoo!の初歩的なスコアスクレーパーを作ることができました。スコアボード、そのように:

def main():
    soup = BeautifulSoup(YAHOO_SCOREBOARD)
    on_first_team = True
    scores = []
    hold = None

    # Iterate the tr that contains a team's box score
    for item in soup(name="tr", attrs={"align": "center", "class": "ysptblclbg5"}):
        # Easy
        team = item.b.a.string

        # Get the box scores since we're industrious
        boxscore = []
        for quarter in item(name="td", attrs={"class": "yspscores"}):
            boxscore.append(int(quarter.string))

        # Final score
        sub = item(name="span", attrs={"class": "yspscores"})[0]
        if sub.b:
            # Winning score
            final = int(sub.b.string)
        else:
            data = sub.string.replace("&nbsp;", "")
            if ":" in data:
                # Catch TV: XXX and 0:00pm ET
                final = None
            else:
                try: final = int(data)
                except: final = None

        if on_first_team:
            hold = { team : (boxscore, final) }
            on_first_team = False
        else:
            hold[team] = (boxscore, final)
            scores.append(hold)
            on_first_team = True

    for game in scores:
        print "--- Game ---"
        for team in game:
            print team, game[team]

日曜日にこれを微調整して、実際にラフなので、どのように動作するかを確認します。現在のところ、次のように出力されます。

--- Game ---
Green Bay ([0, 13, 14, 7], 34)
Detroit ([7, 0, 0, 5], 12)
--- Game ---
Oakland ([0, 0, 7, 0], 7)
Dallas ([3, 14, 0, 7], 24)

それを見てください、私もボックススコアを奪いました...まだ起こっていないゲームの場合、私たちは次のようになります:

--- Game ---
Washington ([], None)
Philadelphia ([], None)

とにかく、あなたがジャンプするためのペグ。幸運を。

于 2009-11-29T05:48:54.983 に答える
3

nfl.com の上部に、Flash ベースの自動更新スコアボードがあります。ネットワーク トラフィックを監視すると、次のことがわかります。

http://www.nfl.com/liveupdate/scorestrip/ss.xml

これはおそらく、HTML スコアボードよりも解析しやすいでしょう。

于 2009-11-29T15:11:02.150 に答える
2

tagsoupを調べます。最終的に Java で DOM ツリーまたは SAX ストリームを作成したい場合、それがチケットです。特定の情報を抽出したいだけなら、Beautiful Soup は Beautiful Thing です。

于 2009-11-29T20:11:09.277 に答える