@R星校长

3关:网页数据分析


任务描述

下图是2016年国防科技大学分数线的网页,在浏览器中我们可以看到,各省的最高分、最低分、平均分都整齐地排列自在表格中。一个网页的源代码时常有成百上千行,其中很多代码都是为了布局页面样式服务的,而我们时常关心的是网页上的数据,而并不关心样式代码。所以如何从冗长的网页源代码中提取我们关心的数据,是这一关我们将要一起学习和体验的内容。

相关知识

课程视频 1《网页数据 - 使用正则表达式提取数据》

上面的课程视频1介绍了如何使用正则表达式提取网页数据,下面通过文字进一步详细描述正则表达式在Python中的使用。

网页代码中的规律

河南省一本线、工程类最高分、最低分、平均分、合训类最高分最低分平均分分别为523665644652659629638

用浏览器查看网页源代码,在河南这一行的表项中这些数据依次排列,而且省份和分数都在标签</span>前面。有关html表格的知识请参见背景知识。

Python内容匹配的re模块

re模块是Python的正则表达式模块,有关正则表达式的更多知识参见预背景知识,下面我们来介绍re模块的常用函数。

函数re.findall(pattern, string[, flags])
string中查找所有符合pattern正则表达式模式的子串,以这些子串作为列表元素返回一个列表。
参数说明:

  • pattern:要搜寻的正则表达式;
  • string:要检索的字符串;
  • flag:可选项,可设置搜索的要求。可以选择输入
    re.Sre.I等。re.S:如果不使用re.S参数,则只在每一行内进行匹配,如果一行没有,就换下一行重新开始,不会跨行。而使用re.S参数以后,正则表达式会将这个字符串作为一个整体,将\n当做一个普通的字符加入到这个字符串中,在整体中进行匹配;re.I:忽略大小写。

下面给出了具体的使用示例:

# coding=utf-8
import re
string = 'o1n27m3k486'
pattern = r'[1-9]+'
print(re.findall(pattern, string))

输出结果:

['1', '27', '3', '486']

函数re.search(pattern,string,flags)
参数与re.findall()的参数意义相同。re.search函数会在字符串内查找模式匹配,只要找到第一个匹配然后返回MatchObject对象,如果字符串没有匹配,则返回None
下面给出了具体的使用示例:

# coding=utf-8
import re
string = 'o1n27m3k486'
pattern = r'[1-9]+'
print(re.search(pattern, string).group(0))

输出结果:

1

函数re.compile(pattern,flags=0)
编译正则表达式模式,返回一个对象的模式。(可以把那些常用的正则表达式编译成正则表达式对象,这样可以提高一点效率。)
参数与re.findall()re.search()的参数意义相同。
下面给出了具体的使用示例:

# coding=utf-8
import re
string = 'o1n27m3k486'
pattern = r'[1-9]+'
obj = re.compile(pattern)
print(obj.findall(string))

输出结果:

['1', '27', '3', '486']

下面的课程视频2介绍了使用正则表达式提取网页中表格数据的方法。

课程视频 2《网页数据 - 表格数据提取》

编程要求

仔细阅读网页源代码信息,补全step3()函数。通过2016年国防科技大学分数线的网页源代码按省抽取最高分、最低分、平均分信息,并保存下来,具体任务如下:

  • 按tr标签获取表格中所有行,保存在列表rows中;
  • 迭代rows中的所有元素,获取每一行的td标签内的数据,并把数据组成item列表,将每一个item添加到scorelist列表;
  • 将由省份,分数组成的8元列表(分数不存在的用/代替)作为元素保存到新列表score中。

注意:本关只要抽取具体的数值,该表中前三行分别为标题、类别和分数分类的具体描述,这三行的数据不需要保存。

测试说明

预期输出:

[['甘肃', '490', '632', '621', '625', '630', '597', '608'], ['吉林', '530', '658', '639', '649', '634', '599', '615'], ['新疆', '464', '673', '617', '630', '612', '534', '578'], ['广西', '502', '642', '601', '620', '603', '584', '592'], ['上海', '360', '489', '475', '480', '/', '/', '/'], ['广东', '508', '641', '600', '613', '619', '585', '597'], ['内蒙古', '484', '641', '615', '627', '623', '558', '597'], ['陕西', '470', '665', '628', '638', '639', '596', '615'], ['四川', '532', '665', '626', '643', '651', '612', '623'], ['黑龙江', '486', '667', '623', '641', '628', '580', '600'], ['安徽', '518', '655', '620', '631', '647', '608', '621'], ['河北', '525', '682', '654', '667', '669', '640', '649'], ['江西', '529', '645', '614', '629', '613', '589', '599'], ['浙江', '600', '692', '670', '679', '676', '652', '661'], ['湖南', '517', '662', '635', '644', '646', '593', '609'], ['宁夏', '465', '637', '565', '597', '590', '481', '526'], ['山东', '537', '679', '655', '665', '660', '597', '637'], ['河南', '523', '665', '644', '652', '659', '629', '638'], ['山西', '519', '639', '617', '625', '638', '579', '599'], ['天津', '512', '659', '634', '649', '600', '537', '567'], ['北京', '548', '662', '607', '629', '613', '570', '592'], ['重庆', '525', '671', '644', '655', '654', '634', '642'], ['云南', '525', '680', '653', '663', '663', '627', '639'], ['青海', '416', '596', '562', '580', '571', '502', '533'], ['江苏', '353', '404', '376', '386', '384', '355', '366'], ['福建', '465', '632', '614', '623', '606', '485', '576'], ['海南', '602', '829', '710', '750', '737', '672', '700'], ['贵州', '473', '671', '627', '643', '658', '600', '616'], ['辽宁', '498', '660', '624', '637', '641', '607', '621'], ['湖北', '512', '665', '622', '640', '637', '604', '614']]

开始你的任务吧,祝你成功!

# -*- coding: utf-8 -*-
import urllib.request as req
import re# 国防科技大学本科招生信息网中2016年录取分数网页URL:
url = 'http://www.gotonudt.cn/site/gfkdbkzsxxw/lqfs/info/2017/717.html'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表示没有找到leftindex = td[:rightindex].rfind('>')items.append(td[leftindex+1:rightindex])scorelist.append(items)# 3.将由省份,分数组成的7元列表(分数不存在的用\代替)作为元素保存到新列表score中,不要保存多余信息for record in scorelist[3:]:record.pop()score.append(record)
####### End #######return score
# print("各省分数线如下:")
# print(step3())
# if step3() == step3():
#     print("结果正确")
# else:
#     print("结果错误")


我 问号 敲错,输入中文问号,结果给我报错,查不出哪里出问题

我的报错信息

写代码的时候一定要万分谨慎,马虎会让你多做事,浪费20%-50%的时间成本



网页抓取及信息提取(三)相关推荐

  1. EduCoder答案-网页抓取及信息提取

    简介 答案查询的入口网页版 其他各类实训答案的目录见这里 答案获取的方法简介见这里 并不是所有的关卡都有答案,有些只有部分关卡有 不要直接复制答案哦 网页抓取及信息提取 >>>查看 ...

  2. 网页抓取及信息提取(一)

    @R星校长 第1关:利用URL获取超文本文件并保存至本地 当我们想要在浏览器中打开一个网页时,需要在浏览器的地址栏中输入该网页的url,例如在地址栏中输入百度搜索网站的首页url:https://ww ...

  3. 爬虫实战——网页抓取及信息提取

    第1关:利用URL获取超文本文件并保存至本地文本文件 任务描述 当我们想要在浏览器中打开一个网页时,需要在浏览器的地址栏中输入该网页的url,例如在地址栏中输入百度搜索网站的首页url:https:/ ...

  4. 几种PHP实现网页抓取的程序代码

    网页抓取就像搜索引擎一个可以去自动抓取其它服务器上的内容了,下面我整理的几个php常用做法,大家一起来看看. 抓取某一个网页中的内容,需要对DOM树进行解析,找到指定节点后,再抓取我们需要的内容,过程 ...

  5. 网页抓取/数据抽取/信息提取软件工具包MetaSeeker

    MetaSeeker是一个Web网页抓取/数据抽取/页面信息提取工具包,能够按照用户的指导,从Web页面上筛选出需要的信息,并输出含有语义结构的提取结果文件(XML文件),众所周知,Web页面显示的信 ...

  6. python爬虫怎么爬同一个网站的多页数据-如何用Python爬数据?(一)网页抓取

    如何用Python爬数据?(一)网页抓取 你期待已久的Python网络数据爬虫教程来了.本文为你演示如何从网页里找到感兴趣的链接和说明文字,抓取并存储到Excel. 需求 我在公众号后台,经常可以收到 ...

  7. 实现织梦dedecms百度主动推送(实时)网页抓取

    做百度推广的时候,如何让百度快速收录呢,下面提供了三种方式,今天我们主要讲的是第一种. 如何选择链接提交方式 1.主动推送:最为快速的提交方式,推荐您将站点当天新产出链接立即通过此方式推送给百度,以保 ...

  8. 系统检测到您疑似使用网页抓取工具访问本_12款最常使用的网络爬虫工具推荐...

    网络爬虫在当今的许多领域得到广泛应用.它的作用是从任何网站获取特定的或更新的数据并存储下来.网络爬虫工具越来越为人所熟知,因为网络爬虫简化并自动化了整个爬取过程,使每个人都可以轻松访问网站数据资源.使 ...

  9. 用TinySpider进行网页抓取实例

    本例中用到的maven坐标变化如下: <dependency> <groupId>org.tinygroup</groupId> <artifactId> ...

最新文章

  1. 【基础知识】截长图的方法以及防止截图时下拉框自动收回的方法
  2. 北漂经历 | 我在北京这几年
  3. PHP设计模式 外观模式(Facade)
  4. 【点播系列之一】关于阿里视频云点播解决方案,你想知道的都在这里!
  5. python的基本语句_Python的基本语句
  6. 72 Zabbix邮件告警
  7. mysql存储文件用什么类型_块存储、文件存储、对象存储的区别是什么?
  8. CRM数据库表COM_TA_R3_ID的数据来源
  9. 做自适应网站专业乐云seo_什么叫网站优化-网站建设-SEO优化
  10. Redis —— 常用命令一览
  11. Nodejs之旅开始
  12. 20165231 2017-2018-2 《Java程序设计》第8周学习总结
  13. android底部导航栏选中动画,Android选中突出背景效果的底部导航栏功能
  14. Google 程序员消灭 Bug 的 5 大法宝!
  15. 在一个递增有序链表中插入新结点并保持链表递增顺序不变
  16. Redis面试题汇总(附答案),面试突击专用
  17. linux 微信机器人,开源Linux操作系统的机器人(组图)
  18. 监听audio是否加载完毕
  19. VIVO NEX3高层预热,差0.4到100%屏占比,这得让多少人心动
  20. 萨姆·阿尔特曼:如何获得成功(How To Be Successful)译文

热门文章

  1. html5 i标签什么意思,快速了解HTML5 b和i标签
  2. Pytorch 冻结网络层
  3. 小波变换的前因后果(三)
  4. 向来痴,从此醉,先生一路走好。
  5. 1477_AURIX TC275 iLLD中看门狗密码获取接口分析
  6. mac mini u盘安装系统_桔子系统U盘启动安装教程
  7. Ubuntu 安装Trac
  8. 摩纳哥通过与华为合作 成为欧洲首个实现5G全覆盖国家
  9. 一句话木马原理与实战
  10. VMware CentOS6.5 安装VMware Tools