要求:从因特网.上搜索相关Web网页,处理网页html数据,从中提取出当前时间点北京各监测站的PM2.5浓度,输出格式如下。要求:写出各个处理步骤,并给出解释。
1.在互联网上搜索北京PM2.5找到网站https://tianqi.2345.com/air-54511.htm,通过浏览器的调试模式定位到各监测站的PM2.5浓度的html格式。
2.登录ubantu服务器,用wget命令获得该网站的html源码。
3.通过检查html文件发现,日期和时间位于不同的位置
因此要将日期和时间拼起来需要定位到两行。
4.检查PM2.5浓度,发现PM2.5浓度位于
并且需要的地点名称和对应PM2.5浓度在不同的两行上。
5.因为sed和awk都是以行为单位执行的,因此考虑先将时间和地点名称以及PM2.5所在四行合并成一行,写出awk脚本如下,经过awk脚本,包含日期、时间、地点名称、PM2.5浓度的四行会合并成一行,方便后续更改格式。
执行file.awk脚本后,输出文件如下,
cat air-54511.htm | awk -f file.awk
可见,需要的日期,时间,地点名称,PM2.5浓度已经合并为一行。
file.awk脚本解释:
# 最先开始执行,初始化一些变量
BEGIN{
# 用来存储日期那行
date="";
# 用来存储时间那行
time="";
# 记录标记某个地区名称的行号
line = 99999;
# 记录包含某个地区名称和包含PM2.5的两行
linetxt = "";
}
# 对每一行执行一下操作,经过以下操作,包含日期,时间,地点名称,PM2.5浓度会合并成一行,方便后续更改格式
{
# 判断是否是日期那行,如果是把这行赋给date
if($0~/date-nongli/){
date=$2;
}
# 判断是否是时间那行, 如果是把这行赋给time,并加上时间秒
else if($0~/box-mod-th-right-tips/){
time=$4":00";
}
# 判断是否是包含地区名称那行,如果是标记行号line, 把这行赋给linetxt
else if($0~/left-txt/ && $0!~/监测站点/){
linetxt = "";
line = NR;
linetxt = linetxt""$0;
}
# 判断是否是地区下的第二行(包含PM2.5浓度),如果是,把包含日期,时间,地点名称,PM2.5浓度的四行合并成一行打印
else if(NR==line+2){
print date time linetxt $0 "\n";
}
}
}
6.最后使用sed命令把每一行替换成我们想要的格式,
sed命令为:
sed 's/c.*>\(.*\)<b>.*\/div>\(.*:00\).*\"left-txt\">\(.*\)<\/td>.*<td>\(.*[0-9]\)<\/td>/\1 \2,\3,\4/g'
7.最后所有指令执行效果如下,
cat air-54511.htm | awk -f file.awk | sed 's/c.*>\(.*\)<b>.*\/div>\(.*:00\).*\"left-txt\">\(.*\)<\/td>.*<td>\(.*[0-9]\)<\/td>/\1 \2,\3,\4/g'