第一关:利用网页地址获取超文本文件
编程要求
利用urllib.request模块中的方法,补全step1()函数。将aeu学科专业网中的录取分数网页抓取下来,并保存在本地,具体要求如下:
正确使用urllib.request的相关函数,获取指定url的内容;
将获取的页面内容,写入本地文件,命名为aeu.txt。
# -*- coding: utf-8 -*-
import urllib.request as req
import os
import hashlib
import sys
import shutil
# 中国人民解放军陆军工程大学学科专业网页URL:
url = 'http://www.aeu.edu.cn/1717/list.htm' # 录取分数网页URL
def step1():
# 请按下面的注释提示添加代码,完成相应功能
#********* Begin *********#
# 1.将网页内容保存到data
webpage = req.urlopen(url)
data = webpage.read() # 按照类文件的方式打开网页
# 一次性读取网页的所有数据
# 2.将读data以二进制写模式写入以学号命名的 “aeu.txt” 文件:
outfile = open("aeu.txt","wb")
outfile.write(data)
outfile.close() # 按二进制写方式打开文件
# 将网页数据写入文件
#********* End *********#
def step2():
# 请按下面的注释提示添加代码,完成相应功能
webpage = req.urlopen(url)
data = webpage.read()
outfile = open("ans.txt", 'wb')
outfile.write(data)
outfile.close()
step1()
step2()
#检验文件内容的正确性
def getHash(f):
line = f.readline()
hash = hashlib.md5()
while (line):
hash.update(line)
line = f.readline()
return hash.hexdigest()
def IsHashEqual(f1, f2):
str1 = getHash(f1)
str2 = getHash(f2)
return str1 == str2
f1 = open('aeu.txt', 'rb')
f2 = open('ans.txt', 'rb')
if IsHashEqual(f1, f2):
print("结果正确")
else:
print('结果错误,请检查是否读取了整个网页和是否已二进制写入aeu.txt文件')
os.remove('ans.txt')
第2关:提取链接地址
编程要求
仔细阅读网页源代码信息,补全Begin-End区域step2()函数,从网页中找到中国人民解放军陆军工程大学学科专业网站网页中'1学科群', '2学科群', '3学科群', '4学科群', '5学科群','6学科群'六个学科群的子链接url数据,并提取出来。提示:使用find()函数定位这六个url,并保存在列表urls中()。
注意:提取的超链是相对地址,需要加上站点域名,拼接成完整的URL。
# -*- coding: utf-8 -*-
import urllib.request as req
import os
# 中国人民解放军陆军工程大学学科专业网页URL:
url = 'http://www.aeu.edu.cn/1717/list.htm'
webpage = req.urlopen(url) # 按照类文件的方式打开网页
data = webpage.read() # 一次性读取网页的所有数据
data = data.decode('utf-8') # 将byte类型的data解码为字符串(否则后面查找就要另外处理了)
def step2():
# 建立空列表urls,来保存子网页的url
urls = []
# 请按下面的注释提示添加代码,完成相应功能
#********* Begin *********#
# 从data中提取每一个学科群的子网站地址添加到urls列表中
years = ['通信与电子信息学科群','网络与指挥信息系统学科群', '作战工程保障学科群', '国防工程与防护学科群', '兵器科学技术学科群','装备信息技术学科群']
for year in years:
id = data.find(year)
href = data[id-52:id-25] # 根据各个特征串提取url子串
website = 'http://www.aeu.edu.cn'+href
urls.append(website)
#********* End *********#
return urls
# -*- coding: utf-8 -*-
url = 'http://www.aeu.edu.cn/1717/list.htm'
webpage = req.urlopen(url)
data = webpage.read() # 一次性读取网页的所有数据
data = data.decode('utf-8') # 将byte类型的data解码为字符串
ans = []
years = ['通信与电子信息', '网络与指挥信息系统', '作战工程保障', '国防工程与防护', '兵器科学技术','装备信息技术']
for year in years:
index = data.find("%s学科群" %year)
href = data[index-52:index-25] # 根据单个特征串提取url子串
website = 'http://www.aeu.edu.cn'
ans.append(website + href)
print("提取子链接如下:")
print(step2())
if ans == step2():
print("结果正确")
else:
print("结果错误")
第3关:网页数据分析
# -*- coding: utf-8 -*-
import urllib.request as req
import re
# 2020年陆军工程大学部分省市招生情况统计表网页URL:
url = 'http://61.155.106.1/zhaosheng/'
webpage = req.urlopen(url) # 根据超链访问链接的网页
data = webpage.read() # 读取超链网页数据
data = data.decode('utf-8') # byte类型解码为字符串
# 获取网页中的第一个表格中所有内容:
table = re.findall(r'<table(.*?)</table>', data, re.S)
firsttable = table[0] # 取网页中的第一个表格
# 数据清洗,将表中的 ,\u3000,和空格号去掉
firsttable = firsttable.replace(' ', '')
firsttable = firsttable.replace('\u3000', '')
firsttable = firsttable.replace(' ', '')
def step3():
score = []
# 请按下面的注释提示添加代码,完成相应功能,若要查看详细html代码,可在浏览器中打开url,查看页面源代码。
#********* Begin *********#
# 1.按tr标签对获取表格中所有行,保存在列表rows中:
rows = re.findall(r'<tr(.*?)</tr>', firsttable, re.S)
# 2.迭代rows中的所有元素,获取每一行的td标签内的数据,并把数据组成item列表,将每一个item添加到scorelist列表:
scorelist = []
for row in rows:
items = []
tds = re.findall(r'<td.*?>(.*?)</td>', row, re.S)
for td in tds:
rightindex = td.find('<span>') # 返回-1表示没有找到
rightindex = td.find('</span>')
leftindex = td[:rightindex].rfind('>')
items.append(td[leftindex+1:rightindex])
scorelist.append(items)
# 3.将由省份,分数组成的15元列表(分数不存在的用/代替)作为元素保存到新列表score中,不要保存多余信息
for record in scorelist[3:]:
record.pop()
score.append(record)
#********* End *********#
return score
url = 'http://61.155.106.1/zhaosheng/'
webpage = req.urlopen(url) # 根据超链访问链接的网页
data = webpage.read() # 读取超链网页数据
data = data.decode('utf-8') # byte类型解码为字符串
table = re.findall(r'<table(.*?)</table>', data, re.S)
firsttable = table[0] # 取网页中的第一个表格
# 数据清洗,将表中的 ,\u3000,和空格号去掉
firsttable = firsttable.replace(' ', '')
firsttable = firsttable.replace('\u3000', '')
firsttable = firsttable.replace(' ', '')
def step4():
score = []
rows = re.findall(r'<tr(.*?)</tr>', firsttable, re.S)
scorelist = []
for row in rows:
items = []
tds = re.findall(r'<td.*?>(.*?)</td>', row, re.S)
for td in tds:
rightindex = td.find('</span>') # 返回-1表示没有找到
leftindex = td[:rightindex].rfind('>')
items.append(td[leftindex+1:rightindex])
scorelist.append(items)
for record in scorelist[3:]:
record.pop()
score.append(record)
return score
print("2020年陆军工程大学部分省市分数线如下:")
print(step3())
if step3() == step4():
print("结果正确")
else:
print("结果错误")
老师都说了摸板有问题,不用抄了