4

そこで、yahoo の RSS フィードを使用して NHL のシーズンのスコアを取得するプログラムを作成しようとしています。

私は経験豊富なプログラマーではないので、まだ頭に入っていないことがいくつかあります。ただし、これまでの私のコードは次のとおりです。


from urllib.request import urlopen
import xml.etree.cElementTree as ET

YAHOO_NHL_URL = 'http://sports.yahoo.com/nhl/rss'

def retrievalyahoo():
    nhl_site = urlopen('http://sports.yahoo.com/nhl/rss')
    tree = ET.parse(urlopen(nhl_site))

retrievalyahoo()

上記のタイトルは、前述のコードをテストした後に発生するエラーを示しています。

編集:さて、修正後、トレースバックエラーは次のようになります。私は困惑しています:

Traceback (most recent call last):
  File "C:/Nathaniel's Folder/Website Scores.py", line 12, in <module>
    retrievalyahoo()
  File "C:/Nathaniel's Folder/Website Scores.py", line 10, in retrievalyahoo
    tree = ET.parse(nhl_site)
  File "C:\Python33\lib\xml\etree\ElementTree.py", line 1242, in parse
    tree.parse(source, parser)
  File "C:\Python33\lib\xml\etree\ElementTree.py", line 1730, in parse
    self._root = parser._parse(source)
  File "<string>", line None
xml.etree.ElementTree.ParseError: not well-formed (invalid token): line 17, column 291
4

1 に答える 1

5

urlopen問題は、 の結果を呼び出そうとしていることですurlopen

次のように、一度呼び出すだけです。

nhl_site = urlopen('http://sports.yahoo.com/nhl/rss')
tree = ET.parse(nhl_site)

エラーメッセージはおそらくもっといいかもしれません。のドキュメントを見るとurlopen

文字列またはオブジェクトの URL urlを開きます。Request

明らかに、http.client.HTTPResponse返されるオブジェクトは文字列でもRequestオブジェクトでもありません。ここで起こったことはurlopen、それが文字列ではないことを認識し、したがってそれが であると想定し、オブジェクトが持つRequestメソッドと属性にアクセスしようとし始めることです。Requestこの種の設計は一般的には良いことです。なぜなら、 のように振る舞うものを渡すことができ、それらはそのまま動作するからです…しかし、 のように振る舞わないRequestものを渡すと、エラー メッセージが不思議。Request

于 2013-08-06T02:03:04.143 に答える