Educode--网页抓取及信息提取【LGD】

本文介绍了使用Python的urllib.request模块抓取中国人民解放军陆军工程大学学科专业网页数据,包括获取指定URL的内容、保存至本地文件,以及提取链接地址和进行网页数据分析。通过实例展示了如何提取学科群子链接和2020年部分省市的招生分数线。
摘要由CSDN通过智能技术生成

第一关:利用网页地址获取超文本文件

编程要求

利用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]           # 取网页中的第一个表格
# 数据清洗,将表中的&nbsp,\u3000,和空格号去掉
firsttable = firsttable.replace('&nbsp;', '')
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]           # 取网页中的第一个表格
# 数据清洗,将表中的&nbsp,\u3000,和空格号去掉
firsttable = firsttable.replace('&nbsp;', '')
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("结果错误")

老师都说了摸板有问题,不用抄了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值