实例来源:MOOC慕课 北京理工大学 嵩天老师的课程实例-《中国大学排名定向爬虫》

1. 概览

对《中国大学排名定向爬虫》实例的改造过程。
学习html网页中表格的提取和解析方法

主要技术方法

requests的获取网页
bs4解析html页面并提取内容

2. 原代码分析

目标

目标网址:http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html
image.png

结果

image.png

由于网站的改变,原代码已经不能直接运行了
取代网址:’https://www.shanghairanking.cn/rankings/bcur/2021’

检查步骤

1. 检查目标信息是否可以在html网页提取

2. 识别table的层级结构和信息目标

网页——鼠标右键——查看网页源代码——搜索关键信息
image.png网页——F12
image.png
《中国大学排名定向爬虫》实例-代码修正 - 图5

  • 找到tbody的子节点tr
  • 找到tr的第1、2、5个子节点提取信息

    小结

    .prettify() 使标签树美观输出,使内容易于阅读
    .find(‘tbody’) 找到tbody
    .children 向下找到子节点
    .string 提取标签中的字.符串内容
    .replace(“ “,””) 数据清洗,去除空格
    .strip(“\n”) 数据清洗,去除换行符

    3. 代码改造

    ```python

    CrawUnivRankingB改造.py

    import requests from bs4 import BeautifulSoup import bs4

def getHTMLText(url): try: r = requests.get(url, timeout=30) #获取html信息 r.raise_for_status() #获取异常信息 r.encoding = r.apparent_encoding #编码 return r.text #返回text except: return “”

def fillUnivList(ulist, html): soup = BeautifulSoup(html, “html.parser”) #解析html页面 for tr in soup.find(‘tbody’).children: if isinstance(tr, bs4.element.Tag):

  1. #print(tr.prettify())
  2. tds = tr('td')
  3. ulist1 = tds[0].string.replace(" ","").strip("\n")
  4. ulist2 = tds[1]('a')[0].string.replace(" ","").strip("\n")
  5. ulist3 = tds[4].string.replace(" ","").strip("\n")
  6. print(ulist1)
  7. print(ulist2)
  8. print(ulist3)
  9. print('\n')
  10. ulist.append([ulist1, ulist2, ulist3])

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 = ‘https://www.shanghairanking.cn/rankings/bcur/2021‘ html = getHTMLText(url) fillUnivList(uinfo, html) printUnivList(uinfo, 20) # 20 univs

main()

  1. <a name="fw8o6"></a>
  2. ## 主要内容:
  3. 技术路线:requests - bs4
  4. 1. bs4库的安装
  5. 1. html中表格内容的获取
  6. 2. 中文对齐问题的解决
  7. 2. 空格和换行符的去除
  8. <a name="mrPEB"></a>
  9. # 补充内容
  10. <a name="cAMLk"></a>
  11. ## bs4库的安装
  12. bs4库能对html、xml格式(标签类)进行解析,并提取相关的信息。<br />官网:https://www.crummy.com/software/BeautifulSoup/<br />![](https://cdn.nlark.com/yuque/0/2022/jpeg/22731262/1647763094357-c1371f5e-2a53-4a71-9f49-8c6ca53560c7.jpeg)
  13. <a name="q8iob"></a>
  14. ## 安装命令
  15. ```python
  16. #pip安装
  17. pip install beautifulsoup4
  18. #换国内源pip安装
  19. pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ beautifulsoup4

引入bs4库

  1. import bs4 #安装时为beautifulsoup4,但引用的时候是简写的bs4
  2. from bs4 import BeautifulSoup #引入Beautifulsoup类,注意B和S需要大写

下行遍历

image.png

  1. #遍历儿子节点
  2. for child in soup.body.children:
  3. print(child)
  4. #遍历子孙节点
  5. for child in soup.body.children:
  6. print(child)

上行遍历

image.png

平等遍历

image.png

prettify方法

  1. <tag>.prettify()
  2. soup.prettify()