2016-09-06 19 views
0

subway scheduleページに表示されるデータ(行、宛先、時刻、および位置)を取得したいとします。bashスクリプトでhtmlからデータを抽出する

私は今のために書いたコードは次のとおりです。

#!/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 
+0

:。 awkの-F " |"「/ <\/*t[rd]> */{print $ 1、$ 2、$ 4、$ 5} 'ruter1.htmlのような結果を出しました:Bergkrystallen via Majorstuen Ringo via Storo 1分 2 ........(6つのグループでは)まだまだ乱雑でhtmlタグが付いているようです。 しかしawkについてはほとんど分かりませんが、改善できません。だから、私はむしろループをユーザにするか、何かを理解しやすくする。 –

+0

また、Pro = 1またはPro = 2の1行(最初の地下鉄時間)だけを印刷したいと思っています(たとえば./subwayコマンドを実行すると、コマンドラインのフラグに従います)。 sh -W、それはplatform1の最新の地下鉄の時刻を与​​えるか、または./subway.sh -Eというコマンドを与えるとplatform2の最新の地下鉄の時刻を与​​える) –

答えて

3

Don't use regular expressions for this at all. HTMLからXMLへの変換、およびXPathを使う - 単なるテキストマッチとは反対に、文書のセマンティクスに働くクエリ言語:

与えられた入力HTMLの場合
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 

、今日のように、出力は次のようになります。

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 

ここで使用されるツールは、(対応XHTMLに厄介なHTMLに変換するため)

$'\t'シンタックスでは、使用中のシェルが実際にbashになる必要があることに注意してください。/bin/shではない)。 links

+0

ありがとう!しかし、私はあなたが何かをインストールする必要があります結果を得ていない書き込み、私は試してみましたか?もう1つの問題は、Pro = 1またはPro = 2の1行(最新のもの)だけを印刷する必要があるということです(たとえばコマンドラインにフラグに従って./subway.sh -Wまたは./subway.sh -E) –

+0

あなたはtidyとxmlstarletがインストールされている必要があります。どちらか一方がインストールされていない場合は、stderrに自明のエラーがあります。特定のプラットフォームのフィルタリングに関しては、適切に '-m" // h:tr [h:td [5] = '1'] "または" 2 "にすることができます。 –

3

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

出力:私のように、awkの一部に、このコードに少し変更でした

 
    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 
+2

Niiii​​ce。これは私が忘れてしまったツールです。 –

+0

または 'lynx -dump 'です。 – Cyrus

+0

リンクはもっと活発に維持されていませんか? lynxの印象は、それが基本的に10年以上前の死んだプロジェクトであったということでした。 –

関連する問題