import requests
from bs4 import BeautifulSoup
import bs4
def getHTMLText(url):
r = requests.get(url)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
def fillUnivList(html, unlist):
soup = BeautifulSoup(html, 'html.parser')
for tr in soup.find('tbody').children:
if isinstance(tr, bs4.element.Tag):
tds = tr('td')
unlist.append([tds[0].string, tds[1].string, tds[3].string, tds[4].string])
def printUnivList(unlist, num):
list = "{:^10}\t{:^30}\t{:^10}"
print(list.format("排名", "学校", "总分"))
for i in range(num):
if i <= 49:
u = unlist[i]
print(list.format(u[0], u[1], u[2]))
else:
u = unlist[i]
print(list.format(u[0], u[1], 'None'))
def main():
unlist = []
num = 100
url = "http://www.zuihaodaxue.com/subject-ranking/computer-science-engineering.html"
html = getHTMLText(url)
fillUnivList(html, unlist)
printUnivList(unlist, num)
main()
刚开始总是出现如下错误:
print(list.format(u[0], u[1], u[2]))
TypeError: unsupported format string passed to NoneType.format
这是针对unlist.append([tds[0].string, tds[1].string, tds[3].string, tds[4].string])中含有空字符。
后来回去分析网页的源代码发现排名第51的北京航空航天大学的总分是没有的。
<tr class="bgfd"><td class="ranking">51-75</td><td class="align-left" width=300>北京航空航天大学</td><td width=50><img src="../image/flag/China.png" title = 中国></td><td></td><td>73.5</td><td style="display: none;margin:0;text-align:center;" id=5>70.2</td><td style="display: none;margin:0;text-align:center;" id=6>62.3</td><td style="display: none;margin:0;text-align:center;" id=7>21.5</td><td style="display: none;margin:0;text-align:center;" id=8>0</td></tr>
即tds[3]在50之后是空的。所以出现错误。
所以我在对输出函数printUnivList()函数利用if else语句进行拆分两段进行打印。