#采用request-bs4路线实现了中国大学排名定向爬虫
# 对中英文混排输出问题进行优化
import requests
from bs4 import BeautifulSoup
import bs4
#import bs4 为了使用它的标签类型定义
def getHTMLText(url) :
try:
r = requests.get(url, timeout = 30)
# print(r.status_code)200为正常,其他信息都有误
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return 'Get Failed.'
def fillUnivList(ulist, html):
soup =BeautifulSoup(html, 'html.parser')
#print(soup[0:500]) 报错:TypeError: unhashable type:'slice'
for tr insoup.find('tbody').children:
if isinstance(tr, bs4.element.Tag) :
# isinstance(object,classinfo) isinstance函数来判断一个对象是否为某个类型的实例
#tr有可能不是标签类型,此处判断起过滤的作用
tds =tr('td')
# 将所有的td标签放入列表tds中
# print(tds[0]) 输出:
# print(tds)
ulist.append([tds[0].string, tds[1].string, tds[3].string])
def printUnivList(ulist, num):
#tplt = '{:^10}\t{1:{3}^10}\t{:^10}' 报错:ValueError: cannot switchfrom automatic field numbering to manual fieldspecification
tplt ='{0:^10}\t{1:{3}^10}\t{2:^10}'
#其中0 表示第一个填充位置,1 第二个,以此类推
#:号后面带填充的字符,只能是一个字符,不指定的话默认是用半角空格填充
#print('{ :^10}\t{ :^6}\t{ :^10}'.format('排名', '学校名称', '总分'))//报错:KeyError: ' '
#print({:^10}\t{:^6}\t{:^10}.format('排名', '学校名称','总分'))
print(tplt.format('排名','学校名称', '总分', chr(12288)))
#chr(12288) 应该是全角空格
#一个汉字也只算一个字符
for i inrange(num):
u = ulist[i]
print(tplt.format(u[0], u[1], u[2],chr(12288)))
def main():
uinfo = []
url ='http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html'
html =getHTMLText(url)
fillUnivList(uinfo,html)
printUnivList(uinfo, 20) # 20 univ
main()
B站学习连接: 【Python网络爬虫与信息提取】.MOOC. 北京理工大学