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 

다음과 같은 오류와 함께 올라오고 계속하지만, 내가 관련이 없습니다 내 코드에 대한 대답, 어쩌면 내가 파이썬과 같은 멍청한 놈인 것 때문에.

스크립트는 다음과 같습니다.

objektid = dom.getElementsByTagName('that') 

그렇게 목록이 비어 :

#!/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

시도처럼 뭔가를 할 주위에

는 objektid'가'print'ing'얻으려면 - 당신이 빈 목록을 얻고있는 것 같습니다, 그래서 마티의 @ 볼 때 아무것도 인덱스 0 – thegrinner

답변

5

<that>이 발견 된 없음 요소를 평가한다. 이러한 태그를 포함하지

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

:

코드를 테스트, 나는 메시지가 나타납니다. 오류 메시지는 사용중인 특정 봇 아이디가 존재하지 않거나 더 이상 존재하지 않음을 나타냅니다. 아마도 Pandorabots homepage에서 자신의 새 봇에 가입해야할까요?

나는 당신이 을 수행하고 있음을 주목한다. 약간의 역겨내는 언 스커 핑. 왜 그 태그 아래에있는 텍스트 노드를 잡아서 DOM 라이브러리가 당신을 대신해서 처리하게할까요?

파이썬에 포함 된 ElementTree API을 사용하는 것이 더 편할 수도 있습니다.

+2

에 없다 질문 편집 - 난 그냥 페이지, 아무 기회를 닫습니다 :) – alecxe

+0

도움이 답변을 많이 주셔서 감사합니다, 실제로 내가 잘못 된 로봇 ID를 사용했다. 다시 한 번 도움을 주셔서 감사합니다. – AppleTattooGuy

1

는 dom.getElementsByTagName 전혀 아무 것도 반환하지 않는 경우 문제는 여기

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

이며, 다음 [0], objektid의 첫 번째 요소가 존재하지 않습니다 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)