[TOC]
题目要求
从因特网上搜索相关Web网页,处理网页html数据,从中提取出当前时间点北京各监测站的PM2.5浓度,输出格式如下。要求:写出各个处理步骤,并给出解释。
2020-03-09 13:00:00,海淀区万柳,73
2020-03-09 13:00:00,昌平镇,67
2020-03-09 13:00:00,奥体中心,66
2020-03-09 13:00:00,海淀区万柳,73
2020-03-09 13:00:00,昌平镇,73
2020-03-09 13:00:00,奥体中心,75
使用wget命令获取网页内容
1 | wget http://www.86pm25.com/city/beijing.html |
使用cat命令查看生成的文件内容
1 | cat beijing.html |
使用sed命令将HTML中的标签内容替换为空格
使用正则表达式 <[^>]*>
找出所有标签
进行这一步是为了更方便地找到所需要的文字内容
1 | cat beijing.html | sed 's/<[^>]*>/ /g' |
编写正则表达式
可以看到,需要的包含时间的行都包括 “更新:” 这个字符串
需要的包含pm2.5数据的行都包括 “数字μg” 这个字符串
使用正则式表达则分别为:更新:
和 [0-9][0-9]*μg
使用grep命令验证如下:
可以发现其中时间行的第1域和第2域分别为日期和时间
数据行的第1域和第3域分别为地点和pm2.5浓度
编写awk文件
使用vim命令编写a.awk文件
1 | vim a.awk |
生成一个名为a.awk的文件并进入vim编辑模式
按下i
进入输入模式,按下x
删除当前光标所在处的字符,按下:
进入底线命令模式(输入命令)
在insert输入模式下,按下 Esc 键退出输入模式进入命令模式
在底线命令模式下,w
保存文件,q
退出程序
编辑a.awk文件如下:
1 | /更新:/{d=$1;t=$2;}/[0-9][0-9]*μg/{printf("%s,%s,%s,%s\n",d,t,$1,$3);} |
其中将通过正则表达式更新:
找到的时间行的第一域(日期)保存为变量d,将第二域(时间)保存为变量t,最后和通过正则表达式[0-9][0-9]*μg
找到的数据行的第一域(地点)和第三域(pm2.5浓度)同时输出。
使用awk命令进行输出:
1 | cat beijing.html | sed 's/<[^>]*>/ /g' | awk -f a.awk |
修改为标准格式
对比题目中给出的标准输出格式,修改如下:
将多余的字符 更新:
、日,
、μg/m³
删除
将 年
、月
替换为 -
将 时
替换为 :00:00
1 | cat beijing.html | sed 's/<[^>]*>/ /g' | awk -f a.awk | sed -e 's/更新:/ /g' -e 's/年/-/g' -e 's/月/-/g' -e 's/日,/ /g' -e 's/时/:00:00/g' -e 's/μg\/m³/g' |
注意其中μg/m³
中的/
需要转义,应写为μg\/m³
并且由于之前的a.awk文件是基于消除HTML标签后的内容进行编写的,所以必须要先消除<>标签后再使用awk,不能将消除<>的sed命令和之后的sed -e命令合并。
最后成功输出如图所示: