2014-09-12 3 views
-2

Следующий код продолжает давать мне ошибку IndexError: list index out of range на линии print (aTweet + '~' + timeSource[x] + '~' + keyWord[i]). Это связано с keyword[i] термином? Я понимаю, что Index out of range обычно означает, что один предоставляет индекс, для которого элемент списка не существует. Означает ли это, что ошибка на самом деле может лежать в этом разделе:Python: Index Out of Range Error

if (len(splitSource) > 20): 
       max_range = 19 
      else: 
       max_range = len(splitSource) 

Код ссылки:

import re 
from re import sub 
import time 
import cookielib 
from cookielib import CookieJar 
import urllib2 
from urllib2 import urlopen 
import difflib 
import sys 

cj = CookieJar() 
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) 
opener.addheaders = [('User-agent', 'Mozilla/5.0')] 

keyWord = ["Scotch"] 

def main(): 
    i=0 
    while i<len(keyWord): 
     startingLink = 'https://twitter.com/search/realtime?q='+keyWord[i] 
     tUrl = startingLink+'&src=hash' 

     oldTwit = [] 
     newTwit = [] 


     howSimAr = [.5,.5,.5,.5,.5] 

     sourceCode = opener.open(tUrl).read() 
     splitSource = re.findall(r'<p class="js-tweet-text tweet-text">(.*?)</p>',sourceCode) 
     timeSource = re.findall(r'js-nav" title="(.*?)"',sourceCode) 

     if (len(splitSource) > 20): 
      max_range = 19 
     else: 
      max_range = len(splitSource) 

     print '' 
     print '' 
     print '' 
     ##print 'Keyword: ' + keyWord[i] 
     print ''    

     for x in range (0, max_range): 
      aTweet = re.sub(r'<.*?>','',splitSource[x]) 
      print (aTweet + '~' + timeSource[x] + '~' + keyWord[i]) 
      #print ';' 
      newTwit.append(aTweet) 

##  comparison = difflib.SequenceMatcher(None, newTwit, oldTwit) 
##  howSim = comparison.ratio() 
##  print ';' 
##  print 'This selection is',howSim,'similar to the past' 
##  howSimAr.append(howSim) 
##  howSimAr.remove(howSimAr[0]) 
## 
##  waitMultiplier = reduce(lambda x, y: x+y, howSimAr)/len(howSimAr) 
## 
##  print '' 
##  print 'The current similarity array:',howSimAr 
##  print 'Our current Multiplier:', waitMultiplier 

     oldTwit = [None] 
     for eachItem in newTwit: 
      oldTwit.append(eachItem) 

     newTwit = [None] 

     time.sleep(2) 
     x = 0 
     i = i + 1 

## except Exception, e: 
##  print str(e) 
##  print 'errored in the main try' 
main() 
+0

Вы индексируете 'timeSource' на' x', но диапазон 'x' определяется длиной' splitSource' (через 'max_range'). Если 'splitSource' длиннее (имеет больше элементов), чем' timeSource', это не сработает. –

+0

@Tom Это имеет смысл, было бы лучше создать другую переменную? –

+0

Мне непонятно, какие отношения между 'splitSource' и 'timeSource' есть или что ваш код пытается сделать. Они оба, похоже, относятся к твитам, но я не знаю, какие данные вы ожидаете? Например. когда вы ищете ключевое слово «Scotch», сколько элементов вы ожидаете в 'splitSource' и сколько в' timeSource'? –

ответ

0

В исходном коде страницы поиска щебет нулевые вхождения js-nav" title=" так второй регулярное выражение будет ничего не находите. На самом деле, добавив

print "len(timeSource) =", len(timeSource) 
print "max_range =", max_range 

перед

for x in range (0, max_range): 

покажет:

len(timeSource) = 0 
max_range = 20 

Все, что вы хотите АРХИВ, вы бы лучше с помощью HTMLParser или так, чтобы работать с HTML чем с использованием re. Это упростит уверенность в том, что timeSource[x] и splitSource[x] будут принадлежать друг другу для всех x.