2016-01-02 129 views
0

我有這樣的代碼:蟒蛇2.x的維基解析

import urllib 
from bs4 import BeautifulSoup 

base_url='https://en.wikipedia.org' 
start_url='https://en.wikipedia.org/wiki/Computer_programming' 
outfile_name='Computer_programming.csv' 
no_of_links=10 

fp=open(outfile_name, 'wb') 

def get_links(link): 
    html = urllib.urlopen(link).read() 
    soup = BeautifulSoup(html, "lxml") 
    ret_list=soup.select('p a[href]') 
    count=0 
    ret=[] 
    for tag in ret_list: 
     link=tag['href'] 
     if link[0]=='/' and ':' not in link and link[:5]=='/wiki' and '#' not in link: 
      ret.append(base_url+link) 
      count=count+1 
     if count==no_of_links: 
      return ret 

l1=get_links(start_url) 
for link in l1: 
    fp.write('%s;%s\n'%(start_url,link)) 

for link1 in l1: 
    l2=get_links(link1) 
    for link in l2: 
     fp.write('%s;%s\n'%(link1,link)) 

    for link2 in l2: 
     l3=get_links(link2) 
     for link in l3: 
      fp.write('%s;%s\n'%(link2,link)) 

fp.close() 

是節省節點的鄰居在csv文件。 但是當我嘗試運行它,我得到這個錯誤:

for link in l3: 

TypeError: 'NoneType' object is not iterable 

我得到當我試圖爲另一個維基百科的鏈接運行的代碼,就像https://en.wikipedia.org/wiki/Technology同樣的錯誤。 它工作的唯一頁面是:https://en.wikipedia.org/wiki/Computer_science。這是一個問題,因爲我需要收集更多網站上的數據,而不僅僅是計算機科學。

任何人都可以給我一個提示如何處理它?

非常感謝。

+1

你應該調試你的程序行由行。似乎在函數get_links的某個時刻出現count!= no_of_links,所以函數返回None。 –

+0

空鏈接應該被跳過,而不是讓程序停止,這就是問題 – Lila

+0

如果頁面上的鏈接少於10個,該怎麼辦?嘗試在函數結束時返回ret。 –

回答

0

如果ret_list是空的,或者有比要求的環節少,代碼需要一個分支,沒有任何明確的return聲明,當它在函數結束脫落,因此隱含返回None

不深入等問題與此代碼,你可能希望這樣的事情,而不是:

def get_links(link): 
    html = urllib.urlopen(link).read() 
    soup = BeautifulSoup(html, "lxml") 
    ret_list=soup.select('p a[href]') 
    count=0 
    ret=[] 
    for tag in ret_list: 
     link=tag['href'] 
     if link[0]=='/' and ':' not in link and link[:5]=='/wiki' and '#' not in link: 
      ret.append(base_url+link) 
      count=count+1 
     if count==no_of_links: 
      break 
    return ret