BASH解析网HTML的尝试

来源:互联网 发布:室内设计用哪些软件 编辑:程序博客网 时间:2024/04/28 23:38

起因:

  每天都要用浏览器查看天气预报,然后用手机发给家里。
  中国天气网的页面上有许多不必要的信息,正好最近在学习Liunx命令,就想用bash实现对网页信息解析只显示天气信息。


思路:

  1. 利用wget下载网页到本地
  2. 利用grep找到所需信息所在行号
  3. 按照行号读取相应行
  4. 再次用grep得到纯粹的天气信息

效果:

源信息:

  1. <h1>周二</h1>
  2. <h2>11日</h2>
  3. <big class="jpg50 d01"></big>
  4. <big class="jpg50 n00"></big>
  5. <p class="wea" title="多云转晴">多云转晴</p>
  6. <p class="tem tem1">
  7. <span>20<
  8. <li class="dn" data-dn="7d4">
  9. /span><i>°C</i>
  10. </p>
  11. <p class="tem tem2">
  12. <span>5</span><i>°C</i>
  13. </p>
  14. <p class="win">
  15. <em>
  16. <span title="无持续风向" class=""></span>
  17. <span title="无持续风向" class=""></span>
  18. </em>
  19. <i>微风</i>
  20. </p>
  21. <div class="slid"></div>

期望结果:

周二
11日
多云转晴
20℃
15℃
微风

执行:

  1. 第一步:
    很简单,不说了。
  2. 第二步:
  1. cat $file | grep -n '<h2>[0-9]*日</h2>' | awk 'BEGIN{FS=":"} {printf "%-d ",$1}'

  重点是后面`awk 'BEGIN{FS=":"} {printf "%-d ",$1}' `这个是现学现用的。

  awk: 文本处理神器

  BEGIN{FS=":"}: 指定":"作为分隔符

  {printf "%-d ", $1}: 格式化输出行号

  1. 第三步:
    由第二步得到的是3,表示第三行,接下来把第三行及相关的6 8 11 18共五个行号存在数组中:
  1. for NUM in `cat $file | grep -n '<h2>[0-9]*日</h2>' | awk 'BEGIN{FS=":"} {printf "%-d ",$1}'`
  2. do
  3. ((ln_num[((i++))]=$NUM))
  4. ((ln_num[((i++))]=$NUM+3))
  5. ((ln_num[((i++))]=$NUM+5))
  6. ((ln_num[((i++))]=$NUM+8))
  7. ((ln_num[((i++))]=$NUM+15))
  8. done

在做第四步之前先把相应行显示出来看是否出错:

  1. IFS="
  2. "
  3. for LINE in `cat $file`
  4. do
  5. ((++j))
  6. for MK in ${ln_num[*]}
  7. do
  8. if [ "$j" -eq "$MK" ]
  9. then
  10. echo $LINE
  11. break
  12. fi
  13. done
  14. done

第一次正确的显示出了源信息中的3,6,8,11,18行,可是第二天网页更新后,得到的却不是相应的5行了。我打开html看到行数没错。我怎么也想不明白问题出在哪。真是奇怪。第三步先跳过,看第四步吧。
4. 第四步:
发现用grep过滤html太复杂,不易实现。
我想用python或sed或许可以,不过现在我还不太了解它们。
只好先到这了,等学习了python和sed后,应该能把第三步,第四步的问题一起解决。


收获:

其实这次最大的收获在于第二步中awk命令的学习使用,是从酷壳的《AWK简明教程》学习到的。

date: 2014-11-9
                                                                                                                                                                                                                                                            
      

0 0
原创粉丝点击