本文采取的路线是requests-bs4库:
我们学会分析,这张图找到,标签<td>..<td>
1 import requests 2 from bs4 import BeautifulSoup 3 import bs4 4 5 def getHTMLText(url): 6 try: 7 r = requests.get(url) 8 r.raise_for_status() 9 r.encoding = r.apparent_encoding 10 return r.text 11 except: 12 return "产生异常" 13 14 def fillUnivList(ulist, html): 15 soup = BeautifulSoup(html, "html.parser") 16 for tr in soup.find("tbody").children: 17 #检测tr标签,是否为bs4.element.Tag定义的类型 18 if isinstance(tr, bs4.element.Tag): 19 tds = tr("td")#查询td标签 20 ulist.append([tds[0].string, tds[1].string, tds[3].string])#添加二维列表 21 22 def printUnivList(ulist, num): 23 print("{:^10} {:^6} {:^10}".format("排名","学校名称","总分")) 24 for i in range(num): 25 u = ulist[i] 26 print("{:^10} {:^10} {:^12}".format(u[0], u[1], u[2])) 27 28 def main(): 29 uinfo = [] 30 url = "http://www.zuihaodaxue.com/zuihaodaxuepaiming2018.html" 31 html = getHTMLText(url) 32 fillUnivList(uinfo, html) 33 printUnivList(uinfo, 20) 34 35 main()
此时我们可以看到,打印出的结果,对齐的效果,并没有预想的好,以下是原因。
此时将代码改为
1 def printUnivList(ulist, num): 2 tplt = "{0:^10} {1:{3}^10} {2:^10}"#{1:{3}^10},这个里面1和3对应format里面的顺序,而“:” 后面的内容表示填充内容,当长度不够时将自动填充,数字0,1,2必不可少 3 print(tplt.format("排名","学校名称","总分",chr(12288))) 4 for i in range(num): 5 u = ulist[i] 6 print(tplt.format(u[0], u[1], u[2], chr(12288)))
现在看起来好多了,中英文编码问题,很常见,可以这种方式解决。