当前位置 : 主页 > 编程语言 > python >

Python爬取中国最好大学排行榜报错TypeError: unsupported format string passed to NoneType.__format__

来源:互联网 收集:自由互联 发布时间:2023-02-04
​本文使用的是如下网址: http://gaokao.xdf.cn/201911/10991728.html 1 问题分析与解决 报错为类型错误,显示我们传递了不支持的格式字符串 1.1 strip() 我们查看网页源码,发现我们所传递的字

​ 本文使用的是如下网址:

http://gaokao.xdf.cn/201911/10991728.html

1 问题分析与解决

报错为类型错误,显示我们传递了不支持的格式字符串

1.1 strip()

请添加链接描述 我们查看网页源码,发现我们所传递的字符串头尾包含空格及换行(红色方框),但是这不是报错的原因,这只会导致格式不太好看,因此我在获取字符串是添加了.strip()函数,既tds[0].text.strip()。 strip()函数可去除头尾的指定字符,默认为空格及换行。

1.2 string与text

r.text                           #响应内容的字符串形式,即url对应页面的内容 r.string                        #标签内非属性字符串,<>...<>中字符串,格式:<tag>.string

通过对比我们可以发现r.string获取的是标签内非属性字符串,而我们查看源代码可以发现大学名字不是td标签的字符串,属于td儿子的儿子的儿子……的字符串,因此tds[0].string只能获取到None。

所以应该使用r.text获取,即tds[1].text.strip()

ulist.append([tds[0].text.strip(), tds[1].text.strip(), tds[3].text.strip()])

2 爬取结果

排名 .   学校名称    . 总分 1 .   清华大学    . 北京市 2 .   北京大学    . 北京市 3 .   浙江大学    . 浙江省 4 .  上海交通大学   . 上海市 5 .   复旦大学    . 上海市 6 .   南京大学    . 江苏省 7 . 中国科学技术大学  . 安徽省 8 . 哈尔滨工业大学   . 黑龙江省 9 .  华中科技大学   . 湖北省 10 .   中山大学    . 广东省 11 .   东南大学    . 江苏省 12 .   天津大学    . 天津市 13 .   同济大学    . 上海市 14 . 北京航空航天大学  . 北京市 15 .   四川大学    . 四川省 16 .   武汉大学    . 湖北省 17 .  西安交通大学   . 陕西省 18 .   南开大学    . 天津市 19 .  大连理工大学   . 辽宁省 20 .   山东大学    . 山东省

3 源码显示

import requests from bs4 import BeautifulSoup import bs4 #获取url内容 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): tds = tr('td') ulist.append([tds[0].text.strip(), tds[1].text.strip(), tds[3].text.strip()]) #.strip()去除头尾空格、换行 #格式化输出 def printUnivList(ulist, num): tplt = "{0:^10}\t{1:{3}^10}\t{2:^10}" print(tplt.format("排名", "学校名称", "总分", chr(12288))) for i in range(num): u = ulist[i] print(tplt.format(u[0],u[1],u[2],chr(12288))) #主函数 def main(): uinfo = [] url = 'http://gaokao.xdf.cn/201911/10991728.html' html = getHTMLText(url) fillUnivList(uinfo,html) printUnivList(uinfo,20) # 20 univs main()

网友评论