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 に答える