python网络爬虫与信息采取之解析网页实例---oJ期末成绩排名

本文用到的网址是山东科技大学的oj上的期末成绩排名:http://219.218.128.149/JudgeOnline/contestrank.php?cid=2756

目的:打印出排名,学号,姓名,成绩;

首先,打开网页的源代码,如下:

python网络爬虫与信息采取之解析网页实例---oJ期末成绩排名_第1张图片

你会发现,很混乱,没有层次感;不用急,告诉你一个小技巧,先使用 soup.prettify() 函数进行格式化一下,得到如下结果:

python网络爬虫与信息采取之解析网页实例---oJ期末成绩排名_第2张图片

这样就好受多了;

接下来对源代码进行分析;你会想这么多难道要一句句的看吗,那太浪费时间了吧;对,这样做确实浪费时间,那怎么做呢?

首先,你应该明白你想要得到什么,然后再源代码中直接找你要得到的东西;

此实例中你会发现,信息都在table标签中,不过问题在于有两个table标签,幸好有class这个属性,我们可以根据class属性来精确地得到信息的大致位置。

然后,信息包裹在a标签中,a标签又包裹在td标签中,td标签又包裹在tr标签中,其次,每个人的全部信息都在tr中,所以可以对tr进行循环从而得到每个人的信息,所以思路就是根据导航树一步步的进行遍历从 table--tr,遍历到tr时,当然这里用到了正则表达式直接从tr开始查找;对tr进行循环,然后再tr中查找a标签,存入一个列表中。

import requests
from bs4 import BeautifulSoup
import bs4
import re


url = "http://219.218.128.149/JudgeOnline/contestrank.php?cid=2756"
r = requests.get(url, timeout=30)
r.raise_for_status()
r.encoding = r.apparent_encoding
html = r.text
soup = BeautifulSoup(html, "html.parser")
uniolist = []
count = 1
for tr in soup.find_all("tr",{"class":re.compile("[e|o][v|d][e|d]n*row")}):
    td = tr.find_all('a')
    uniolist.append([count,td[0].string, td[1].string, td[2].string])
    count = count + 1
delt = "{:^5}\t{:^10}\t{:^16}\t{:^10}"
# print(title)
print(delt.format("排名", "学号", "姓名", "solved"))
for i in range(5):
    u = uniolist[i]
    print(delt.format(u[0], u[1], u[2],u[3]))
运行结果:

python网络爬虫与信息采取之解析网页实例---oJ期末成绩排名_第3张图片

隐私保护一下吧

你可能感兴趣的:(python网络爬虫与数据采集)