2

geonames からロンドンの郵便番号データを照会しています。

http://www.geonames.org/postalcode-search.html?q=london&country=GB

出力を郵便番号識別子 (Bethnal Green、Islington など) だけのリストに変換したいと考えています。bashで名前だけを抽出する最良の方法は何ですか?

4

3 に答える 3

4

\nこの区切られたリスト (または括弧内のカンマ区切り) を意味するかどうかはわかりません

html='http://www.geonames.org/postalcode-search.html?q=london&country=GB'
wget -q "$html" -O - |
  w3m -dump -T 'text/html'|
    sed -nr 's/^ +[0-9]+ +(.*) +[A-Z]+[0-9]+ +United Kingdom.*/\1/p'

w3mは、「優れたテーブル/フレームをサポートする WWW ブラウズ可能なページャー」です。

出力 (最初の 10 行)

London Bridge   
Kilburn         
Ealing          
Wandsworth      
Pimlico         
Kensington      
Leyton          
Leytonstone     
Plaistow        
Poplar          
于 2012-04-07T11:52:19.810 に答える
1

このサイトでは (無料ではありませんが) XML または JSON データを使用した Web サービスを提供しています... HTML ページは (簡単に) 解析することを意図していないため、これが最善の方法です。

とにかく、不可能なことは何もありませんが、厳密に bash コマンドだけを使用することは、不可能ではないにしても非常に困難です。多くの場合、結果を達成するために、他のいくつかの一般的なツールがパイプされます。しかし、cat、grep、awk、sed などを組み合わせるよりも、Perl などの単一のツールに固執する方が便利な場合があります。

何かのようなもの

sed -e 's/>/>\n/g' region.html |
   egrep -i "^\s*[A-Z]+[0-9]+</td>" |
   sed -e 's|</td>||g'

コードの特定の形式を想定して、200行を抽出しました。

追加

データの解析に使用できるソフトウェアに制限がない場合は、次のような行を使用できます

wget -q "http://www.geonames.org/postalcode-search.html?q=london&country=GB" -O - |
     sgrep '"<table class=\"restable\"" .. "</table>"' | 
     sed -e 's|/tr>|/tr>\n|g; s|</td>\s*<td[^>]*>|;|g; s|</th>\s*<th[^>]*>|;|g; s|<[^>]\+>||g; s|;;&nbsp;.*$| |g' |
     grep -v "^\s*$" |
     tail -n+2 | cut -d";" -f2,3

;これは、CSV 内の like で区切られた場所と郵便番号、および awk を抽出します。

wget -q "$html" -O - | 
     w3m -dump -T 'text/html' |
     awk '/\s*[0-9]+ / { print substr($0, 11, 16); }'

これは、Peter.O による回答に基づいており、同じデータを抽出します...など。しかし、これらの場合、ほとんどの Unix や GNU システムに見られる最小限のツールに限定されないため、perl などの 1 つの広く普及しているツールに固執します。

于 2012-04-07T11:18:13.930 に答える
1

mojoMojolicious プロジェクトのツールにアクセスできる場合、これはすべて非常に簡単になります。

mojo get 'http://www.geonames.org/postalcode-search.html?q=london&country=GB' '.restable > tr > td:nth-child(2)' text | grep ^'[a-zA-Z]'

最後のgrepは、一部の不要な結果を除外するだけです。ページ構造に若干の一貫性がないため、ほとんど (完全ではない) 1 行おきに問題があります。それ以外の場合はtr:nth-child(even)、良い結果を得ることができます。

于 2012-04-16T17:35:23.323 に答える