#获取维基百科网站的任何页面并提取页面链接 import urllib2 import bs4 html = urllib2.urlopen("http://en.wikipedia.org/wiki/Kevin_Bacon") bsObj = bs4.BeautifulSoup(html.read(), "lxml") for link in bsObj.find("a"): if 'href' in link.attrs: print(link.attrs['href'])
以上代码问题:存在不需要的链接,如侧边栏、页眉、页脚的各种链接。
所需要链接的特点:
它们都在id是bodyContent的div标签里
URL 链接不包含分号
URL 链接都以 /wiki/ 开头
import urllib2 import bs4 import re html = urllib2.urlopen("http://en.wikipedia.org/wiki/Kevin_Bacon") bsObj = bs4.BeautifulSoup(html.read(), "lxml") #利用正则表达式筛选出了不必要的链接 for link in bsObj.find("div", {"id":"bodyContent"}).findAll("a", href=re.compile("^(/wiki/)((?!:).)*$")): if 'href' in link.attrs: print(link.attrs['href'])
继续改进:
一个函数getLinks,可以用维基百科词条/wiki/<词条名称>形式的URL链接作为参数,然后以同样的形式返回一个列表,里面包含所有的词条 URL 链接。
一个主函数,以某个起始词条为参数调用getLinks,再从返回的URL列表里随机选择一个词条链接,再调用 getLinks,直到我们主动停止,或者在新的页面上没有词条链接了,程序才停止运行。
import urllib2 import bs4 import re import datetime import random random.seed(datetime.datetime.now()) def getLinks(articleUrl): html = urllib2.urlopen("http://en.wikipedia.org"+articleUrl) bsObj = bs4.BeautifulSoup(html.read(), "lxml") return bsObj.find("div", {"id":"bodyContent"}).findAll("a", href=re.compile("^(/wiki/)((?!:).)*$")) links = getLinks("/wiki/Kevin_Bacon") while len(links) > 0: newArticle = links[random.randint(0, len(links)-1)].attrs["href"] print(newArticle) links = getLinks(newArticle)