2013-11-15 44 views
0

我在过去的几天中发了几篇文章,所以感谢迄今为止的帮助,所有这些对于帮助初学者都非常感谢。TypeError:'NoneType'对象是不可迭代的,Python

Heads Up,我知道下面的代码看起来很erm非常基本,可能有一个简单和更优雅的方式来实现我所尝试的,但现在这是我可以学习和实际理解的基础知识哈哈。

只是想知道,如果有人实际上可以告诉我是什么错误所致,该程序的输出,它似乎就ok有时运行,与此错误失败,也许2出3

这仍然是一个工作在进行中的项目,主要目的是创建一个程序,我可以自动化一些我手动作为学习环境。

感谢任何Insight。

程序输出

Beginning Mining 
Opener Created 
Opener Headers Added 
Url Assigned 
HTTP Error 503: Service Temporarily Unavailable 
1 
Opener Created 
Opener Headers Added 
Url Assigned 
Page Open and Read 
90378 
soup assigned to rawdata 
filtered for torType Class 
reassigned to soup to tordata 
Links Filtered 
Printing Recent Torrents from Filter WebData function 
['/the-big-bang-theory-s07e08-hdtv-x264-lol-ettv-t8180359.html', '/the-walking-dead-s04e05-hdtv-x264-2hd-ettv-t8158163.html', '/the-vampire-diaries-s05e07-proper-hdtv-x264-2hd-ettv-t8180537.html', '/the-big-bang-theory-7x7-hdtv-lol-t8141134.html', '/how-i-met-your-mother-s09e09-hdtv-x264-2hd-eztv-t8164029.html', '/sons-of-anarchy-s06e10-hdtv-x264-asap-ettv-t8170162.html', '/american-horror-story-s03e06-hdtv-x264-killers-ettv-t8175485.html', '/sleepy-hollow-s01e07-hdtv-x264-lol-eztv-t8164318.html', '/elementary-2x8-hdtv-lol-t8180367.html', '/the-originals-s01e07-hdtv-x264-lol-ettv-t8169688.html', '/the-blacklist-s01e07-hdtv-x264-lol-eztv-t8124923.html', '/modern-family-s05e07-hdtv-x264-2hd-eztv-t8175344.html', '/arrow-s02e06-proper-hdtv-x264-2hd-eztv-t8179975.html', '/white-collar-s05e05-hdtv-x264-2hd-eztv-t8180828.html', '/homeland-s03e07-720p-hdtv-x264-killers-eztv-t8158378.html', '/greys-anatomy-s10e09-hdtv-x264-lol-ettv-t8180608.html', '/how-i-met-your-mother-s09e08-hdtv-x264-2hd-eztv-t8124354.html', '/arrow-s02e05-hdtv-x264-lol-ettv-t8135416.html', '/boardwalk-empire-s04e10-hdtv-x264-2hd-eztv-t8158693.html', '/the-simpsons-s25e04-hdtv-x264-lol-eztv-t8157997.html', '/modern-family-s05e06-hdtv-x264-asap-eztv-t8061643.html', '/new-girl-s03e07-hdtv-x264-lol-eztv-t8130237.html', '/the-tomorrow-people-us-s01e06-hdtv-x264-lol-eztv-t8174964.html', '/the-walking-dead-s04e04-hdtv-x264-2hd-ettv-t8118639.html', '/supernatural-s09e06-hdtv-x264-lol-ettv-t8169899.html'] 
Printing newdata which should be Recent Torrents from Filter WebData function 
['/the-big-bang-theory-s07e08-hdtv-x264-lol-ettv-t8180359.html', '/the-walking-dead-s04e05-hdtv-x264-2hd-ettv-t8158163.html', '/the-vampire-diaries-s05e07-proper-hdtv-x264-2hd-ettv-t8180537.html', '/the-big-bang-theory-7x7-hdtv-lol-t8141134.html', '/how-i-met-your-mother-s09e09-hdtv-x264-2hd-eztv-t8164029.html', '/sons-of-anarchy-s06e10-hdtv-x264-asap-ettv-t8170162.html', '/american-horror-story-s03e06-hdtv-x264-killers-ettv-t8175485.html', '/sleepy-hollow-s01e07-hdtv-x264-lol-eztv-t8164318.html', '/elementary-2x8-hdtv-lol-t8180367.html', '/the-originals-s01e07-hdtv-x264-lol-ettv-t8169688.html', '/the-blacklist-s01e07-hdtv-x264-lol-eztv-t8124923.html', '/modern-family-s05e07-hdtv-x264-2hd-eztv-t8175344.html', '/arrow-s02e06-proper-hdtv-x264-2hd-eztv-t8179975.html', '/white-collar-s05e05-hdtv-x264-2hd-eztv-t8180828.html', '/homeland-s03e07-720p-hdtv-x264-killers-eztv-t8158378.html', '/greys-anatomy-s10e09-hdtv-x264-lol-ettv-t8180608.html', '/how-i-met-your-mother-s09e08-hdtv-x264-2hd-eztv-t8124354.html', '/arrow-s02e05-hdtv-x264-lol-ettv-t8135416.html', '/boardwalk-empire-s04e10-hdtv-x264-2hd-eztv-t8158693.html', '/the-simpsons-s25e04-hdtv-x264-lol-eztv-t8157997.html', '/modern-family-s05e06-hdtv-x264-asap-eztv-t8061643.html', '/new-girl-s03e07-hdtv-x264-lol-eztv-t8130237.html', '/the-tomorrow-people-us-s01e06-hdtv-x264-lol-eztv-t8174964.html', '/the-walking-dead-s04e04-hdtv-x264-2hd-ettv-t8118639.html', '/supernatural-s09e06-hdtv-x264-lol-ettv-t8169899.html'] 
Mining Ended 
Relative Search 
Diagnostic line ['*arrow*', '*grimm*', '*elementary*', '*American*Horror*', '*once*Upon*aTime*', '*Agents*of*shield*'] 
Diagnostic line None 
Searching for My Torrents 
Reset Vars 
Diagnostic line *arrow* 
Traceback (most recent call last): 
    File "C:\Python33\scratchpad.py", line 121, in <module> 
    SearchTorrents(MyPrograms,RecentTorrentLinks) 
    File "C:\Python33\scratchpad.py", line 103, in SearchTorrents 
    matchobj = fnmatch.filter(TorrentList,item) 
    File "C:\Python33\lib\fnmatch.py", line 59, in filter 
    for name in names: 
TypeError: 'NoneType' object is not iterable 

程序代码

WebUrl = 'http://kickasstorrents.come.in/tv/' 
MyPrograms = ['*arrow*','*grimm*','*elementary*','*American*Horror*','*once*Upon*aTime*','*Agents*of*shield*'] 
loop = 0 
RecentTorrentLinks = [] 



def RetrieveWebData(MyUrl): 
    try: 
     #create Url Opener 
     opener = urllib.request.build_opener() 
      #Diagnostic Line 
     print("Opener Created") 
     #Simulation as a browser 
     opener.addheaders =[('User-agent','Mozilla/5.0')] 
      #Diagnostic Line 
     print("Opener Headers Added") 
     url = (MyUrl) 
      #Diagnostic Line 
     print("Url Assigned") 
     #Open URL and read Data 
     page = opener.open(url).read() 
      #Diagnostic Line 
     print("Page Open and Read") 
      #Diagnostic Line 
     print(len(page)) 
     newdata = FilterWebData(page) 
      # Diagnotic Line 
     print ("Printing newdata which should be Recent Torrents from Filter WebData function") 
     print (newdata) 
     return newdata 

    except urllib.error.URLError as e: 
     print(e) 
     if e.code == 503: 
      print (loop ++ 1) 
      RetrieveWebData(WebUrl) 
     else: 
      print('Error Occured :-' + e + ' Code :- '+ e.code) 
      sys.exit() 




def FilterWebData(RawData): 
    RecentTors = [] 

    try: 

     soup = BeautifulSoup(RawData) 
      #Diagnostic Line 
     print (" soup assigned to rawdata") 

     TorData = soup.find_all("a", {"class" : "torType"}) 
      #Diagnostic Line 
     print (" filtered for torType Class") 

     soup = BeautifulSoup(str(TorData)) 
      #Diagnostic Line 
     print (" reassigned to soup to tordata") 
     for link in soup.find_all('a'): 
      RecentTors.append(link.get('href')) 

      #Diagnostic Line 
     print ("Links Filtered") 
      # Diagnotic Line 
     print ("Printing Recent Torrents from Filter WebData function") 
     print (RecentTors) 
     return RecentTors 

    #Simpler Version of my code by StackOverlfow User 
     #TorData = soup.find_all("a", {"class" : "torType", 'href': True}) 
     #return [link['href'] for link in TorData] 

    except OSError as e: 
     print("An error occurred during filtering",e) 



def SearchTorrents(SearchCrit,TorrentList): 
    try: 
        #Diagnostic Line 
     print ('Diagnostic line ' + str(SearchCrit)) 
     print ('Diagnostic line ' + str(TorrentList)) 
        #Diagnostic Line 
     print ("Searching for My Torrents") 
     item = " " 
     matchobj = " " 
        #Diagnostic Line 
     print ("Reset Vars") 

     for item in SearchCrit: 
         #Diagnostic Line 
      print ('Diagnostic line ' + item) 
      #print ('Diagnostic line ' + str(TorrentList)) 
      matchobj = fnmatch.filter(TorrentList,item) 
      print (matchobj) 
    except OSError as e: 
     print("An error occurred during searching",e) 

    #Diagnostic Line 
print ("Beginning Mining") 
RecentTorrentLinks = RetrieveWebData(WebUrl) 

      #Diagnostic Line 
print ("Mining Ended") 

      #Diagnostic Line 
print ("Relative Search") 
      #Diagnostic Line 
#print ("Diagnotic Line TorrentLinks ") 
#print (RecentTorrentLinks) 

SearchTorrents(MyPrograms,RecentTorrentLinks) 

      #Diagnostic Line 
print ("Relative Ended") 
+0

好感谢的答案,我implementated错误检查和我换成一个全局变量在retreieveweb函数的返回,名单正在分发从变量到变量到很多,只要我拿这个,也许不正确的快捷方式,这一次似乎是第一次工作。感谢您的见解和帮助:) – DeadZero

回答

4

你的TorrentList实际上是None这意味着你不能迭代它。

改变这一行

matchobj = fnmatch.filter(TorrentList,item) 

if TorrentList is not None: 
    matchobj = fnmatch.filter(TorrentList,item) 
else: 
    # Throw whatever error/exception you need 
+0

感谢codegeek,我将添加,除此之外,但我不明白的列表不应该为空作为进一步的代码,它应该生成的列表,但它似乎转向没有时传递给搜索功能。感谢和感谢 – DeadZero

2

它看起来像变量TorrentList有时不是列表,而是为NoneType。所以,当你试图过滤它时,它会抛出错误。您应该在代码中添加一个检查,以确保它在过滤之前确实是一个列表。

您可以在输出中看到,错误之前,这些线路都印:

Diagnostic line ['*arrow*', '*grimm*', '*elementary*', '*American*Horror*', '*once*Upon*aTime*', '*Agents*of*shield*'] 
Diagnostic line None 

这些是以下行的输出:

print ('Diagnostic line ' + str(SearchCrit)) 
print ('Diagnostic line ' + str(TorrentList)) 

正如你所看到的,TorrentList打印out'None',而不是列表。所以,正如我上面所说的那样,当您尝试在以下行上对其进行过滤时:

matchobj = fnmatch.filter(TorrentList,item) 

它会引发错误。

+0

感谢forgivenson,我注意到了,但我认为这是一个列表一路通过,它似乎有时它更改为没有时,将它传递到搜索功能,你可以建议如何检查如果这是一个列表,如果这与你自己确定。再次感谢 – DeadZero