昨天学到北理工开设的《Python网络爬虫与信息提取》的“中国大学排名”实例,总结编写实例过程中遇到的一些问题。
url
视频中代码给出的网址是:
http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html
但是编写过程中发现该url已不可用,该网站已改名为软科
要用新的url进行编程:
【软科排名】2021年最新软科中国大学排名|中国最好大学排名
TypeError: unsupported format string passed to NoneType.__format__
这个问题顾名思义是字符串的.format方法出了问题,上网找到了一篇博客记录了相同问题和解决方案:
问题解决:TypeError: unsupported format string passed to NoneType.__format___Mr.Q_LuLu的博客-CSDN博客经过修改(把string方法改成text方法)后的代码是这样的:
def fillUnivList(ulist,html):
soup=BeautifulSoup(html,"html.parser")
for tr in soup.find('tbody').children:
if isinstance(tr,bs4.element.Tag):
tds=tr('td')
ulist.append([tds[0].text.strip(),tds[1].text.strip(),tds[4].text.strip()])
但是又发现一个问题:打印大学名称时还打印出来一些其他的东西(本来还有许多空格,代码中用.strip方法去除,同样借鉴于之前那篇博客)
去除无用信息
其实是网页的源代码发生了变化
于是我花了一个多小时寻找解决方法:“如何打印标签内的特定文本”
结果搜索到的却是一些诸如xpath之类的方法使我这个小白一脸懵逼
我通过“检查”查看了网页的源码:
?这一层层嵌套的<div>直接给我整懵了,“这题超纲了吧?”
最终是在之前这位博主的另一篇博客找到了答案:
Python爬虫入门实例三之爬取软科中国大学排名_Mr.Q_LuLu的博客-CSDN博客
里面有这么一句话:
?a标签?我看的怕是个假的源码???
幸亏原博有图,原来是通过网页查看的源码
我这才恍然大悟:通过检查看到的源码和网页看到的源码并不完全一样
搜索后了解到:“检查”看到的是经过JavaScript修饰的源码,与源代码并不完全一样
根据原博修改了自己的代码,最后也是很快就运行成功了,代码如下:
import requests
from bs4 import BeautifulSoup
import bs4
def getHTMLText(url):
try:
r=requests.get(url,timeout=30)
r.raise_for_status()
r.encoding=r.apparent_encoding
return r.text
except:
return ""
def fillUnivList(ulist,html):
soup=BeautifulSoup(html,"html.parser")
for tr in soup.find('tbody').children:
if isinstance(tr,bs4.element.Tag):
a=tr('a')
tds=tr('td')
ulist.append([tds[0].text.strip(),a[0].text.strip(),tds[4].text.strip()])
def printUnivList(ulist,num):
tplt="{0:^5}\t{1:{3}^15}\t{2:^5}"
print(tplt.format("排名","学校名称","学校总分",chr(12288)))
for i in range (num):
u=ulist[i]
print(tplt.format(u[0],u[1],u[2],chr(12288)))
print ("suc"+str(num))
def main():
uinfo=[]
url='https://www.shanghairanking.cn/rankings/bcur/2021'
html = getHTMLText(url)
fillUnivList(uinfo,html)
printUnivList(uinfo,20)
main()
运行结果:(至于视觉效果应该是每个人不一样(?)可以适当调整输出宽度)
总结
其实这部分本来写了好多话,针对自己学习这个实例时候的波折和学习到的经验以及对多次提到的那位博主的感谢,但是即将完成之际一个ctrl+z直接回到了第二部分少了将近1000字,气得我差点砸电脑(╬ ̄皿 ̄) ,最后也是没恢复成。
希望可以给到同样刚刚入门的学习者一些帮助,同时作为一个学习python过程中的纪念吧(还有第一次写文章却白打1000字(好气啊!))