2014-07-08 4 views
0

내 코드를 실행하는 동안 다음 오류 코드가 표시됩니다. 이 오류는 즉시 발생하지 않으며 2-7 시간 후에 임의로 발생합니다. 오류가 발생할 때까지 온라인 피드를 스트리밍하여 DB에 기록하는 데 문제가 없습니다.MySQL 데이터베이스를 충전하는 동안 "IndexError : 목록 색인이 범위를 벗어남"

오류 메시지 : 여기

Traceback (most recent call last): 
File "C:\Python27\MySQL_finalversion\RSS_common_FV.py", line 78, in <module> 
main() 
File "C:\Python27\MySQL_finalversion\RSS_common_FV.py", line 63, in main 
feed_iii = feed_load_iii(feed_url_iii) 
File "C:\Python27\MySQL_finalversion\RSS_common_FV.py", line 44, in feed_load_iii 
in feedparser.parse(feed_iii).entries] 
IndexError: list index out of range 

당신이 내 코드를 찾을 수 있습니다 추가 정보가 필요하면

import feedparser 
import MySQLdb 
import time 
from cookielib import CookieJar 

db = MySQLdb.connect(host="localhost", # your host, usually localhost 
       user="root", # your username - SELECT * FROM mysql.user 
       passwd="****", # your password 
       db="sentimentanalysis_unicode", 
       charset="utf8") # name of the data base 

cur = db.cursor() 
cur.execute("SET NAMES utf8") 
cur.execute("SET CHARACTER SET utf8") 
cur.execute("SET character_set_connection=utf8") 
cur.execute("DROP TABLE IF EXISTS feeddata_iii") 

sql_iii = """CREATE TABLE feeddata_iii(III_ID INT NOT NULL AUTO_INCREMENT, PRIMARY KEY(III_ID),III_UnixTimesstamp integer,III_Timestamp varchar(255),III_Source varchar(255),III_Title varchar(255),III_Text TEXT,III_Link varchar(255),III_Epic varchar(255),III_CommentNr integer,III_Author varchar(255))""" 

cur.execute(sql_iii) 

def feed_load_iii(feed_iii): 
return [(time.time(), 
     entry.published, 
     'iii', 
     entry.title, 
     entry.summary, 
     entry.link, 
     (entry.link.split('=cotn:')[1]).split('.L&id=')[0], 
     (entry.link.split('.L&id=')[1]).split('&display=')[0], 
     entry.author) 
     for entry 
     in feedparser.parse(feed_iii).entries] 

def main(): 
feed_url_iii = "http://www.iii.co.uk/site_wide_discussions/site_wide_rss2.epl" 

feed_iii = feed_load_iii(feed_url_iii) 

print feed_iii[1][1] 

for item in feed_iii: 
    cur.execute("""INSERT INTO feeddata_iii(III_UnixTimesstamp, III_Timestamp, III_Source, III_Title, III_Text, III_Link, III_Epic, III_CommentNr, III_Author) VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s)""",item) 
db.commit() 

if __name__ == "__main__": 
while True: 
    main() 
    time.sleep(240) 

- 문의 주시기 바랍니다. 도움이 필요해!

감사합니다.

+0

먼저 (같은)와 함께 할 수있는 현재 제기되고있는 예외를이 것 간단하게 트랩을 할 오히려 정치 못한 방법으로, 지금 당신의 질문에 대해 당신은 묶는된다 존재하지 않는리스트 ('splits' 참조)에있는 셀에 접근하려면, 코드를 실행하기 전에 엔트리를 인쇄하거나 로깅하여 문제가있는 곳을 확인하십시오. –

+0

올바른 방법으로 당신을 이해합니까? 오류가 feed_load_iii 블록의 split 함수에 속해 있습니까? try : split (X) except : 'NULL'값을 설정하십시오. – user3665218

+0

'def feed_load_iii (feed_iii) :'의'return' 문은 어디에서 왔습니까? –

답변

1

본질적으로 프로그램의 형식이 잘못된 데이터에 대한 복원력이 부족합니다.

코드는 데이터 구조에 대해 매우 명확한 가정을하고 있으며 데이터가 그렇게 구조화되어 있지 않으면 대처할 수 없습니다. 데이터의 형식이 잘못된 경우를 감지하고 다른 조치를 취해야합니다.

당신이 당신의 들여 쓰기를 수정해야

try: 
    feed_iii = feed_load_iii(feed_url_iii) 
except IndexError: 
    # do something to report or handle the data format problem 
+0

** ** 데이터 형식 문제를보고하거나 처리하기 위해 ** 어떤 일을 했는가에 대한 아이디어를 얻었습니까? ** ... 저는 파이썬에 매우 익숙하지 않습니다. ( – user3665218

+0

처음에는 고칠 수있는 것보다보고하십시오. 데이터 오류가 발생하지 않아도됩니다. – holdenweb