网页抓取及信息提取(三)
@R星校长
第3
关:网页数据分析
任务描述
下图是2016
年国防科技大学分数线的网页,在浏览器中我们可以看到,各省的最高分、最低分、平均分都整齐地排列自在表格中。一个网页的源代码时常有成百上千行,其中很多代码都是为了布局页面样式服务的,而我们时常关心的是网页上的数据,而并不关心样式代码。所以如何从冗长的网页源代码中提取我们关心的数据,是这一关我们将要一起学习和体验的内容。
相关知识
课程视频 1《网页数据 - 使用正则表达式提取数据》
上面的课程视频1
介绍了如何使用正则表达式提取网页数据,下面通过文字进一步详细描述正则表达式在Python
中的使用。
网页代码中的规律
河南省一本线、工程类最高分、最低分、平均分、合训类最高分最低分平均分分别为523
,665
,644
,652
,659
,629
,638
。
用浏览器查看网页源代码,在河南这一行的表项中这些数据依次排列,而且省份和分数都在标签</span>
前面。有关html
表格的知识请参见背景知识。
Python内容匹配的re模块
re
模块是Python
的正则表达式模块,有关正则表达式的更多知识参见预背景知识,下面我们来介绍re
模块的常用函数。
函数re.findall(pattern, string[, flags])
从string
中查找所有符合pattern
正则表达式模式的子串,以这些子串作为列表元素返回一个列表。
参数说明:
pattern
:要搜寻的正则表达式;string
:要检索的字符串;flag
:可选项,可设置搜索的要求。可以选择输入
re.S
,re.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] # 取网页中的第一个表格
# 数据清洗,将表中的 ,\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表示没有找到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%的时间成本
网页抓取及信息提取(三)相关推荐
- EduCoder答案-网页抓取及信息提取
简介 答案查询的入口网页版 其他各类实训答案的目录见这里 答案获取的方法简介见这里 并不是所有的关卡都有答案,有些只有部分关卡有 不要直接复制答案哦 网页抓取及信息提取 >>>查看 ...
- 网页抓取及信息提取(一)
@R星校长 第1关:利用URL获取超文本文件并保存至本地 当我们想要在浏览器中打开一个网页时,需要在浏览器的地址栏中输入该网页的url,例如在地址栏中输入百度搜索网站的首页url:https://ww ...
- 爬虫实战——网页抓取及信息提取
第1关:利用URL获取超文本文件并保存至本地文本文件 任务描述 当我们想要在浏览器中打开一个网页时,需要在浏览器的地址栏中输入该网页的url,例如在地址栏中输入百度搜索网站的首页url:https:/ ...
- 几种PHP实现网页抓取的程序代码
网页抓取就像搜索引擎一个可以去自动抓取其它服务器上的内容了,下面我整理的几个php常用做法,大家一起来看看. 抓取某一个网页中的内容,需要对DOM树进行解析,找到指定节点后,再抓取我们需要的内容,过程 ...
- 网页抓取/数据抽取/信息提取软件工具包MetaSeeker
MetaSeeker是一个Web网页抓取/数据抽取/页面信息提取工具包,能够按照用户的指导,从Web页面上筛选出需要的信息,并输出含有语义结构的提取结果文件(XML文件),众所周知,Web页面显示的信 ...
- python爬虫怎么爬同一个网站的多页数据-如何用Python爬数据?(一)网页抓取
如何用Python爬数据?(一)网页抓取 你期待已久的Python网络数据爬虫教程来了.本文为你演示如何从网页里找到感兴趣的链接和说明文字,抓取并存储到Excel. 需求 我在公众号后台,经常可以收到 ...
- 实现织梦dedecms百度主动推送(实时)网页抓取
做百度推广的时候,如何让百度快速收录呢,下面提供了三种方式,今天我们主要讲的是第一种. 如何选择链接提交方式 1.主动推送:最为快速的提交方式,推荐您将站点当天新产出链接立即通过此方式推送给百度,以保 ...
- 系统检测到您疑似使用网页抓取工具访问本_12款最常使用的网络爬虫工具推荐...
网络爬虫在当今的许多领域得到广泛应用.它的作用是从任何网站获取特定的或更新的数据并存储下来.网络爬虫工具越来越为人所熟知,因为网络爬虫简化并自动化了整个爬取过程,使每个人都可以轻松访问网站数据资源.使 ...
- 用TinySpider进行网页抓取实例
本例中用到的maven坐标变化如下: <dependency> <groupId>org.tinygroup</groupId> <artifactId> ...
最新文章
- 【基础知识】截长图的方法以及防止截图时下拉框自动收回的方法
- 北漂经历 | 我在北京这几年
- PHP设计模式 外观模式(Facade)
- 【点播系列之一】关于阿里视频云点播解决方案,你想知道的都在这里!
- python的基本语句_Python的基本语句
- 72 Zabbix邮件告警
- mysql存储文件用什么类型_块存储、文件存储、对象存储的区别是什么?
- CRM数据库表COM_TA_R3_ID的数据来源
- 做自适应网站专业乐云seo_什么叫网站优化-网站建设-SEO优化
- Redis —— 常用命令一览
- Nodejs之旅开始
- 20165231 2017-2018-2 《Java程序设计》第8周学习总结
- android底部导航栏选中动画,Android选中突出背景效果的底部导航栏功能
- Google 程序员消灭 Bug 的 5 大法宝!
- 在一个递增有序链表中插入新结点并保持链表递增顺序不变
- Redis面试题汇总(附答案),面试突击专用
- linux 微信机器人,开源Linux操作系统的机器人(组图)
- 监听audio是否加载完毕
- VIVO NEX3高层预热,差0.4到100%屏占比,这得让多少人心动
- 萨姆·阿尔特曼:如何获得成功(How To Be Successful)译文