2013-08-12 2 views
0

Я получил этот сценарий из форума, и он продолжает идти вверх со следующей ошибкойСинтаксического XML ответа: индекс Перечислите ошибки диапазона

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 

Я искал вокруг ответа на это, но я не могу относиться ответы на мой код, возможно, из-за того, что я был таким noob с 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() 

Ваша помощь в этом высоко ценится

+0

Try '' print'ing objektid' - это выглядит, как вы получаете пустой список, так что нет ничего индекс 0. – thegrinner

ответ

5

Нет элемента <that> был найден:

objektid = dom.getElementsByTagName('that') 

поэтому список пуст.

Тестирование кода, я получаю сообщение:

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

, который не содержит таких меток. Сообщение об ошибке, похоже, указывает на то, что конкретный идентификатор бота, который вы используете, больше не существует или больше не существует. Возможно, вам нужно зарегистрироваться для нового бота на Pandorabots homepage?

Отметьте, что вы делаете Некоторые неприятные unescaping. Почему бы не взять узлы текста под этим тегом и позволить библиотеке DOM заботиться об этом для вас?

Возможно, вы захотите заглянуть в ElementTree API (в комплекте с Python), поскольку он прост в использовании.

+2

Когда я вижу @ Мартейн-х редактирование вопроса - я просто закрываю страницу, никаких шансов :) – alecxe

+0

Большое спасибо за ваш полезный ответ, действительно, я использовал неправильный идентификатор бота. Еще раз спасибо за вашу помощь. – AppleTattooGuy

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) 
Смежные вопросы