在bash脚本中从html中提取数据

时间:2016-09-06 17:28:21

标签: regex bash awk

我想获得此处显示的数据(行,目的地,时间和地点) subway schedule页。

我现在写的代码是:

#!/bin/bash
curl "http://mon.ruter.no/SisMonitor/Refresh?stopid=3010370&computerid=acba4167-b79f-4f8f-98a6-55340b1cddb3&isOnLeftSide=true&blocks=&rows=6&test=&stopPoint=">ruter.html
awk -F "</*td>|</*tr>" '/<\/*t[rd]>.*[A-Z][0-9]/ {print $3, $5, $8, $10 }' ruter.html

2 个答案:

答案 0 :(得分:3)

Don't use regular expressions for this at all.从HTML转换为XML,并使用XPath - 一种处理文档语义的查询语言,而不仅仅是文本匹配:

url="http://mon.ruter.no/SisMonitor/Refresh?stopid=3010370&computerid=acba4167-b79f-4f8f-98a6-55340b1cddb3&isOnLeftSide=true&blocks=&rows=6&test=&stopPoint="

curl "$url" | \
  tidy -asxml -n -c -b -q --show-warnings no | \
  xmlstarlet sel -N h=http://www.w3.org/1999/xhtml \
    -t -m '//h:tr[h:td]' \
    -v ./h:td[1] -o $'\t' \
    -v ./h:td[2] -o $'\t' \
    -v ./h:td[4] -o $'\t' \
    -v ./h:td[5] -n | \
  column -s $'\t' -t

对于给定的输入HTML,截至今天,输出为:

5  Vestli via Majorstuen          nå      1
4  Vestli via Storo               2 min   2
5  Ringen via Majorstuen          4 min   1
5  Sognsvann                      7 min   2
4  Bergkrystallen via Majorstuen  10 min  1
5  Ringen via Storo               12 min  2

这里使用的工具是:

  • HTML Tidy(用于将凌乱的HTML转换为符合标准的XHTML)
  • XMLStarlet(用于执行XPath查询)
  • column(用于将输出格式化为对齐的列)

另请注意,$'\t'语法要求使用的shell确实是bash (而不是/bin/sh)。

答案 1 :(得分:3)

使用links

links -dump 'http://mon.ruter.no/SisMonitor/Refresh?stopid=3010370&computerid=acba4167-b79f-4f8f-98a6-55340b1cddb3&isOnLeftSide=true&blocks=&rows=6&test=&stopPoint='

输出:

   Linje Destinasjon                     Tid    Pos 
   Line  Destination                     Time   Pos 
   4     Vestli via Storo                3 min  2   
   5     Vestli via Majorstuen           3 min  1   
   5     Ringen via Majorstuen           5 min  1   
   5     Sognsvann                       11 min 2   
   4     Bergkrystallen via Majorstuen   12 min 1   
   5     Ringen via Storo                13 min 2