Python XML解析不适用于某些站点

时间:2012-02-08 09:51:21

标签: python xml-parsing

我有一个基于提供here的教程的非常基本的XML解析器,目的是在Python中阅读RSS提要。

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 Shell中使用GetRSS函数时,我得到一个空行作为反馈而不是正确的结果。我还在CNN's "World" RSS feed上对其进行了测试,但也没有收到任何结果。我在所有地址上都使用了urllib.urlopen,它们的节点和子节点(<item><title><description><link></item>)似乎都使用相同的格式。

我认为,就像我之前的问题一样,我可能会发现一些非常明显的东西。有人知道那是什么吗?

编辑:并且为了记录,我的错误信息根本没有出现,但也许是因为我错误地将它集成到了代码中;我不会把它放在我身上。

更新: 在stackoverflow上使用多个已回答的问题从头开始重写代码。奇迹般有效!

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 个答案:

答案 0 :(得分:1)

错误在于:

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

没有根item元素,只有channel。我通过在循环中打印nodeName的所有值来找到它。