Разбор Python XML не работает для некоторых сайтов - PullRequest
1 голос
/ 08 февраля 2012

У меня есть очень простой синтаксический анализатор XML, основанный на руководстве, предоставленном здесь , с целью чтения RSS-каналов в Python.

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 ""

Я протестировал функцию GetRSS по адресу, указанному в руководстве (http://rss.slashdot.org/Slashdot/slashdot),), и он работает просто отлично, предоставляя мне правильную обратную связь. Однако при изучении написания этого модуля я намеревался использовать для чтения RSS-канала на RedLetterMedia (http://redlettermedia.com/feed/). Когда я пытаюсь использовать функцию GetRSS в Python Shell для этого адреса, я получаю пустую строку в качестве обратной связи вместо правильных результатов. Я также проверил ее на RSS-канал "Мир" CNN , и также не получил результатов. Я использовал 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 Ответ

1 голос
/ 08 февраля 2012

Ошибка здесь:

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

Корневого элемента item нет, просто channel. Я выяснил это, просто напечатав все значения nodeName в цикле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...