Разбор Python 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()

is сохраняет окрестность узлов в 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 ответ

Если 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
Другие вопросы по тегам