2012-02-08 12 views
1

PythonでRSSフィードを読む目的で、hereというチュートリアルに基づいて非常に基本的なXMLパーサーがあります。一部のサイトでPython XMLの解析が機能しない

def GetRSS(RSSurl): 
    url_info = urllib.urlopen(RSSurl) 
    if (url_info): 
     xmldoc = minidom.parse(url_info) 
    if (xmldoc): 
     for item_node in xmldoc.documentElement.childNodes: 
      if (item_node.nodeName == "item"): 
       PrintNodeItems(item_node, ["title","link"]) 
    else: 
     print "error" 

def PrintNodeItems(XmlNode, items): 
    for item_node in XmlNode.childNodes: 
     if item_node.nodeName in items: 
      PrintNodesText(item_node) 

def PrintNodesText(XmlNode): 
    text = "" 
    for text_node in XmlNode.childNodes: 
     if(text_node.nodeType == Node.TEXT_NODE): 
      text = text_node.nodeValue 
    if (len(text)>0): 
     print text 
     print "" 

私はチュートリアル(http://rss.slashdot.org/Slashdot/slashdot)で提供されたアドレスにこれをgetRSS機能をテストして、それが正しいフィードバックを提供してくれ、うまく動作します。しかし、このモジュールを書く方法を学ぶときの私の意図は、RedLetterMedia(http://redlettermedia.com/feed/)でRSSフィードを読むために使用することでした。そのアドレスのPythonシェルでGetRSS関数を使用しようとすると、正しい結果の代わりに空白行がフィードバックとして表示されます。私もCNN's "World" RSS feedでそれをテストし、同様の結果は得られませんでした。私はすべてのアドレスにurllib.urlopenを使用しました、そして、彼らはすべて彼らのノードと子ノード(<item><title><description><link></item>)のために同じフォーマットを使用するように見えます。

私の前の質問の場合と同様に、おそらく私が紛失していることが明らかです。誰がそれが何であるか知っていますか?

編集:記録のために、エラーメッセージが表示されませんでしたが、コードに誤って統合されている可能性があります。私はそれを私の向こうに置かないだろう。

update: 複数の回答を使用してスクラッチからコードを書き直しました。魅力的な作品!

def GetRSS(RSSurl): 
    url_info = urllib.urlopen(RSSurl) 
    if (url_info): 
     xmldoc = minidom.parse(url_info) 
    if (xmldoc): 
     channel = xmldoc.getElementsByTagName('channel') 
     for node in channel: 
      item = xmldoc.getElementsByTagName('item') 
      for node in item: 
       alist = xmldoc.getElementsByTagName('link') 
       for a in alist: 
        linktext = a.firstChild.data 
        print linktext 


def main(): 
    GetRSS('http://redlettermedia.com/feed/') 

答えて

1

エラーはここにある:何のルートitem要素、ちょうどchannel

for item_node in xmldoc.documentElement.childNodes: 
    if (item_node.nodeName == "item"): 

はありません。ループ内にnodeNameのすべての値を印刷するだけで、これがわかりました。

+0

そのため、その行の「item」を「channel」に置き換える必要がありますか?私はちょうどそれを試して、結果を今返す: '' 'GetRSS( 'http://redlettermedia.com/feed') http:// redlettermedia.com' これは何の応答もないからステップアップするが、それはまだ私が受け取ろうとしていた応答ではない。なぜ私はこの反応を得ているのか?私はすべてのノードと、その間にそれらを呼び出すための私の試みを調べます。ルート要素 'item'のように、そこにないものを呼び出す場合もあります。 – Jordan

+0

@Jordan:の中で ''を探したいと思うでしょう。 'minidom'の代わりに[LXML](http://lxml.de)を使うことを考えてください。これはXPathをサポートしています。 –

関連する問題