0

我从一个论坛得到这个脚本,它不断出现以下错误

Traceback (most recent call last):
  File "test.py", line 42, in <module> main()
  File "test.py", line 28, in main
    bot_response = objektid[0].toxml()
IndexError: list index out of range

我已经四处寻找答案,但我无法将答案与我的代码联系起来,可能是因为我是 python 的菜鸟。

脚本如下。

#!/usr/bin/python -tt

# Have a conversation with a PandaBot AI
# Author A.Roots

import urllib, urllib2
import sys
from xml.dom import minidom
from xml.sax.saxutils import unescape

def main():

  human_input = raw_input('You: ')
  if human_input == 'exit':
    sys.exit(0)

  base_url = 'http://www.pandorabots.com/pandora/talk-xml'
  data = urllib.urlencode([('botid', 'ebbf27804e3458c5'), ('input', human_input)])

  # Submit POST data and download response XML
  req = urllib2.Request(base_url)
  fd = urllib2.urlopen(req, data)

  # Take Bot's response out of XML
  xmlFile = fd.read()
  dom = minidom.parseString(xmlFile)
  objektid = dom.getElementsByTagName('that')
  bot_response = objektid[0].toxml()
  bot_response = bot_response[6:]
  bot_response = bot_response[:-7]
  # Some nasty unescaping
  bot_response = unescape(bot_response, {"&amp;apos;": "'", "&amp;quot;": '"'})

  print 'Getter:',str(bot_response)

  # Repeat until terminated
  while 1:
    main()

if __name__ == '__main__':
  print 'Hi. You can now talk to Getter. Type "exit" when done.'
  main()

非常感谢您对此的帮助

4

2 回答 2

5

未找到元素<that>

objektid = dom.getElementsByTagName('that')

所以列表是空的。

测试您的代码,我收到消息:

<result status="3" botid="ebbf27804e3458c5"><input>Hello world!</input><message>Failed to find bot</message></result>

其中不包含此类标签。该错误消息似乎表明您正在使用的特定机器人 ID 不存在或不再存在。也许您需要在Pandorabots 主页上注册自己的新机器人?

我注意到你正在做一些令人讨厌的 unescaping。为什么不获取该标签下的文本节点,让 DOM 库为您处理呢?

您可能希望查看ElementTree API(包含在 Python 中),因为它更易于使用。

于 2013-08-12T13:52:50.190 回答
1

问题就在这里

   objektid = dom.getElementsByTagName('that')
   bot_response = objektid[0].toxml()

如果 dom.getElementsByTagName 什么都不返回,那么 objektid[0],objektid 的第一个元素将不存在。因此有错!

要绕过它,请执行以下操作

  objektid = dom.getElementsByTagName('that')
  if len(objektid) >= 0:
      bot_response = objektid[0].toxml()
      bot_response = bot_response[6:]
      bot_response = bot_response[:-7]
      # Some nasty unescaping
      bot_response = unescape(bot_response, {"&amp;apos;": "'", "&amp;quot;": '"'})
  else:
      bot_response = ""

  print 'Getter:',str(bot_response)
于 2013-08-12T13:55:20.670 回答