python3解析和维基百科页面

时间:2015-12-21 18:40:53

标签: parsing python-3.x html-parsing wikipedia

所以我需要从计算机科学'获得前10个链接。维基百科页面。然后我需要为CS页面中的每个链接获取10个链接。所以最后我会有10 * 10 = 100个链接。

直到现在我写了这段代码:

import urllib.request as urllib2
html = urllib2.urlopen('https://en.wikipedia.org/wiki/Computer_science').read()
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, "lxml")


for link in soup.find_all('a', limit=10):
    rez=link.get('href')
    for i in rez.find_all('a', limit=10):
        print(i)

当我运行它时,我收到了这个错误:

' NoneType'对象没有属性' find_all'

谢谢,这有很大帮助。接下来我需要从每个返回的链接获得10个链接,即来自Programming_language_theory,Computational_complexity_theory等的10个链接。我试图像这样做这个部分:

for link in soup.find_all('a', href=True, title=True, limit=10):
        print(link['href'])
        for link2 in link['href'].find_all('a', href=True, title=True, limit=10):
            print(link2['href'])

但是我收到了一个错误:' str'对象没有属性' find_all'

1 个答案:

答案 0 :(得分:0)

我看到的直接问题是运行此代码段时返回的前三项:

for link in soup.find_all('a', limit=10):
    rez=link.get('href')
    print(rez)

是:

None #mw-head #p-search

这就是为什么当你调用rez.find_all()时,python告诉你'NoneType' object has no attribute 'find_all'

修改#2:
消除None返回并找到文章的链接和子链接的可能解决方案是:

for link in soup.find_all('a', href=True, title=True, limit=10):
        print(link['href'])
        sub_html = urllib2.urlopen('https://en.wikipedia.org' + link['href'])
        sub_soup = BeautifulSoup(sub_html, "lxml")
        for sub_link in sub_soup.find_all('a', href=True, title=True, limit=10):
            print(sub_link['href'])

您遇到新问题的原因是您需要为新链接创建新的汤对象,而link['href']只是一个字符串。