Willie bot - 解析rss并检查新帖子

时间:2013-08-02 19:10:56

标签: python bots irc

我正在为我的willie irc bot做一个模块,只要在论坛的给定帖子中出现新帖子,机器人就会发出消息。我遇到的问题非常奇怪,实际上:机器人偶尔会返回一个未处理的异常:

Unhandled exception in thread started by <function lurk at 0x10ebfa8c0>
Traceback (most recent call last):
  line 27, in lurk
    d=c.entries[0].published
IndexError: list index out of range

每隔一段时间我的意思就是:错误随机出现。通常大约30分钟,但一旦完全没有出现整整1.5小时的会话。我对如何处理这个问题有一些想法,但让我们首先看看我的代码:

import willie
import time
import thread
import feedparser
...
@willie.module.commands('startlurking')
def startlurking(bot, trigger):
    def lurk():
        bot.say("Right away, sir.")
        a=feedparser.parse('http://forums.wesnoth.org/feed.php?t=39175')
        b=a.entries[0].published
        while True:
            c=feedparser.parse('http://forums.wesnoth.org/feed.php?t=39175')
            d=c.entries[0].published #this is the line 27
            if not d==b:
                bot.say(trigger.nick + ", I have spotted a new post!")
                bot.say(c.entries[0].link)
                bot.say(c.entries[0].description)
                b=d
            time.sleep(10)

    thread.start_new_thread(lurk, ())

我的第一个想法是10秒的睡眠不足以让我的机器人解析rss。这里有没有人从他们的经验中知道什么时间金额是100%安全的?

第二个想法是忽略错误并做出一个不做任何事情的异常,不会制动循环并只重试整个事情。这会有用吗?

try:
    #here goes the while loop
except:
    Pass

您认为哪个选项更好?我想最终以“专业”的方式开始编码,而不是让noob解决问题。如果你有自己的想法,请说出来。

谢谢!

2 个答案:

答案 0 :(得分:1)

如果d.entries列表中没有项目,则会发生此错误。例如在你的控制台中:

>>> entries = []
>>> entries[0]
... IndexError: list index out of range

要避免此错误,请在继续之前检查是否找到了条目。例如,您可以将循环更改为以下内容:

while True:
    time.sleep(10)
    c=feedparser.parse('http://forums.wesnoth.org/feed.php?t=39175')
    if not c.entries:
        # no entries found, re-enter the loop at the "sleep"
        continue

    # entries found, process them...

注意我已将sleep移至顶部

答案 1 :(得分:0)

似乎您的问题是feedparser.parse没有返回任何条目。不是将整个while循环包装在try except语句中,而是确保返回超过0个条目。

我会用你的while循环替换feedparser.parse('http://forums.wesnoth.org/feed.php?t=39175')

import logging

...

c = feedparser.parse('http://forums.wesnoth.org/feed.php?t=39175')
if not len(c.entries):
    # You can use your own logger instance instead
    # Log any information you need to identify the real problem
    logging.error("No entries found: %s", str(c))
    continue

这可以防止您获得的例外情况,并具有记录信息的附加优势,因此您可以确定未获得任何条目的原因。

您也可以在while循环之外的feedparser.parse调用中执行相同操作,只需将continue替换为return