Regex 在bash脚本中从html提取数据
我想获取此时显示的数据(线路、目的地、时间和pos) 页面 我现在写的代码是:Regex 在bash脚本中从html提取数据,regex,bash,awk,Regex,Bash,Awk,我想获取此时显示的数据(线路、目的地、时间和pos) 页面 我现在写的代码是: #!/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 a
#!/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
#/bin/bash
卷曲“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“|”'/.[A-Z][0-9]/{print$3、$5、$8、$10}ruter.html
将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转换为兼容的XHTML)
- (用于执行XPath查询)
- (用于将输出格式化为对齐列)
$'\t'
语法要求使用的shell必须是bash(而不是/bin/sh
)。将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转换为兼容的XHTML)
- (用于执行XPath查询)
- (用于将输出格式化为对齐列)
还请注意,
$'\t'
语法要求使用的shell必须是bash(而不是/bin/sh
)。带有链接:
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
林杰德斯泰纳松酒店
线路目的地时间Pos
4维斯特利经斯托罗3分钟2
5维斯特利经马约斯图恩3分钟1
5林根经Majorstuen 5分钟1
5 Sognsvann 11分钟2
4 Bergkrystallen经Majorstuen 12分钟1
通过Storo 13分钟5林根2
使用链接
:
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
林杰德斯泰纳松酒店
线路目的地时间Pos
4维斯特利经斯托罗3分钟2
5维斯特利经马约斯图恩3分钟1
5林根经Majorstuen 5分钟1
5 Sognsvann 11分钟2
4 Bergkrystallen经Majorstuen 12分钟1
通过Storo 13分钟5林根2
妮莉丝。这是一个我已经忘记的工具。或者lynx-dump
。链接不是更积极地维护吗?我对lynx的印象是,十多年前,它基本上是一个死气沉沉的项目。这是可能的。没有。最后一次更新是在2016/04/26。你知道猞猁尿可以治疗肾结石吗?Niiiice。这是一个我已经忘记的工具。或者lynx-dump
。链接不是更积极地维护吗?我对lynx的印象是,十多年前,它基本上是一个死气沉沉的项目。这是可能的。没有。最后一次更新是在2016/04/26。你知道猞猁尿可以治疗肾结石吗?非常感谢!但是我在你写的时候试过了,没有得到结果。。。我也应该安装一些东西吗?另一个问题是,我只需要打印Pro=1或Pro=2的一行(最新的一行)(根据命令行的标志,例如,如果我发出命令./subway.sh-W或./subway.sh-E),您确实需要安装tidy和xmlstarlet——如果两者都没有安装,则stderr上应该有一个自解释的错误。对于特定平台的过滤,您可以根据需要将其设置为-m//h:tr[h:td[5]='1']”
或'2'
。非常感谢!但是我在你写的时候试过了,没有得到结果。。。我也应该安装一些东西吗?另一个问题是,我只需要打印Pro=1或Pro=2的一行(最新的一行)(根据命令行的标志,例如,如果我发出命令./subway.sh-W或./subway.sh-E),您确实需要安装tidy和xmlstarlet——如果两者都没有安装,则stderr上应该有一个自解释的错误。对于特定平台的过滤,您可以根据需要将其设置为-m//h:tr[h:td[5]='1']”
或'2'
“ruter1.html并得出了一些结果,比如:Bergkrystallen通过Majorstuen Ringen通过Storo 1 min 2……(在第6组中也是如此)看起来仍然凌乱且带有html标记。但我对awk知之甚少,我无法改进它。因此,我宁愿使用一个循环或其他更容易理解的东西。另一个问题是,我还希望只打印Pro=1或Pro=2的一行(第一次)(根据命令行上的标志,例如,如果我发出命令。/subway.sh-W,它给出platform1的最新地铁时间,或者如果我发出命令。/subway.sh-E,它给出platform2的最新地铁时间)我对awk部分的代码做了一些更改,如:awk-F“|”'/./{print$1,$2,$4,$5}“ruter1.html并得出了一些结果,如:Bergkrystallen通过Majorstuen Ringen通过Storo 1 min 2……。(6组也是如此)看起来仍然凌乱,带有html标签。但是我对awk知之甚少,我无法改进它。所以我宁愿使用一个循环或其他更容易理解的东西。另一个问题是,我还想只打印一行(第一次),其中Pro=1或Pro=2(根据命令行的标志,例如如果我发出命令。/subway.sh-W,则给出平台1的最新地铁时间;如果我发出命令。/subway.sh-E,则给出平台2的最新地铁时间)