Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在bash脚本中从html提取数据_Regex_Bash_Awk - Fatal编程技术网

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

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

我想获取此时显示的数据(线路、目的地、时间和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
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的最新地铁时间)