2011-06-29 19 views
1

私は、地震情報センター(USGS)から地震パラメータを自動的にダウンロードする方法に取り組んでいます。残念ながら、彼らのフォーマットはうんざりです。私は彼らのフォーマットを変えるように説得することは大したことはないと思います。だから、私は<pre> htmlのブロックを表形式にするだけです。文字列ブロックの書式設定チャレンジ

しかし、文字列の書式設定に関する私の経験は限られているので、私は固執しています(ただし、誰かが解決策を持っている可能性があります)。

April 15, 2010, UTAH, MW=4.6 
ORIGIN TIME:  23:59:42.8 0.4 
LAT:41.72N 0.03;LON:110.86W 0.03 
DEP: 12.5 1.8;TRIANG HDUR: 0.6 
BEST DBLE.COUPLE:M0= 1.07*10**23 
NP1: STRIKE=193;DIP=35;SLIP= -80 

私はこのようなフォーマットを希望:

name date  time  lon  lat dep dep_err Mw M0  strike dip slip 
UTAH 2010/04/15 23:59:42.8 -110.86 41.72 12.5 1.8  4.6 1.07e23 193 35 -80 

注経度を変換するIがフォーマット必要な情報を与える

curl --silent http://earthquake.usgs.gov/earthquakes/eqinthenews/2010/uu00002715/uu00002715_gcmt.php |\ 
sed -n '/<pre>/,/<\/pre>/p' |\ 
egrep -v '(#)|(pre>)' |\ 
egrep '(MW)|(ORIGIN)|(LAT)|(DEP)|(BEST DBLE)|(NP1)' 

:ここでの例です東経(したがって、符号の変更)に。

私はawkpython、またはunix shellコマンドであることを解決したいのですが、私はrubyまたはperlを(私はおそらく何が起こっているのか理解できないだろう)楽しま思います。

答えて

1

ここではほとんどの方法が得られるawkスクリプトです。ロン、日付の変換、M0、などが課題として残されている:

curl --silent http://earthquake.usgs.gov/earthquakes/eqinthenews/2010/uu00002715/uu00002715_gcmt.php | 
awk ' 
    BEGIN { 
     FS = "[,:;= ]+" 
     OFS = "^" 
    } 
    /<pre>/ {process=1} 
    /<\/pre>/ {process=0} 
    ! process {next} 
    /MW=/ { 
     date = $1 " " $2 " " $3 
     place = $4 
     mw = $NF 
    } 
    /^ORIGIN TIME:/ { 
     otime = $3 ":" $4 ":" $5 
    } 
    /^LAT:.*LON:/ { 
     lat = $2 
     lon = $5 
    } 
    /^DEP:/ { 
     dep = $2 
     dep_err = $3 
    } 
    /^BEST DBLE.COUPLE:/ { 
     m0 = $NF 
    } 
    /^NP1:/ { 
     strike = $3 
     dip = $5 
     slip = $7 
    } 
    END { 
     print "name", "date", "time", "lon", "lat", "dep", "dep_err", "Mw", "M0", "strike", "dip", "slip" 
     print place, date, otime, lon, lat, dep, dep_err, mw, m0, strike, dip, slip 
    } 
' | column -s^-t 

出力:正規表現と

name date   time  lon  lat  dep dep_err Mw M0   strike dip slip 
UTAH April 15 2010 23:59:42.8 110.86W 41.72N 12.5 1.8  4.6 1.07*10**23 193  35 -80 
+0

私は謙虚です。どうもありがとうございます! –

3

this oneなどのXML形式のフィードの1つを使用するだけではいかがですか。私はそれが解析するのが簡単だと確信しています。

+0

を:)ことができれば、私は提案を感謝してもあなたは間違いなくではなく、XML/RSSを使用する必要があります。問題は科学的です。私が公開するソリューション(と私が使っているもの)が最終的な見積もりであることを確認する必要があります。多くの場合、公開されたモデルでは数時間から数日かけて修正が行われるため、すぐにRSSフィードに依存することはできません。 –

2

HTML解析は、通常、非常に、非常に悪い考えと見られたので、私は」 d秒のアビザンのRSSフィードの使用の提案。実際、USGSはXMLダウンロードも提供しています(http://earthquake.usgs.gov/earthquakes/catalogs/参照)。何らかの理由であなたがそれを行うことができないと<pre>ブロックはそれ以上の構造を持っていないとして、その後、HTMLを使用するを持っている場合は

このため、次のPythonの作品を(lxmlのかbeautifulsoupを使用してのような素敵な何かを除外) single例...正規表現はおそらく非常に壊れやすく(そして率直に言って)、さらなる例/例外を扱うためには微調整が必​​要です。

これはExcelファイルに書き出すので、複数のページをスクラップするためにすべてをループでポップすることができます(すばらしいプレーをして条件をチェックし、レートとキャッシュを制限します)。

import httplib2 
import re 
from xlwt import Workbook 

h = httplib2.Http(".cache") 
url = 'http://earthquake.usgs.gov/earthquakes/eqinthenews/2010/uu00002715/uu00002715_gcmt.php' 
resp, content = h.request(url, "GET") 
regex = re.compile("<pre>\s*(?P<date>.* \d{2}, \d{4}), (?P<name>\w.*), MW=(?P<Mw>\d.\d).*ORIGIN TIME:\s*(?P<time>\d{2}:\d{2}:\d{2}.\d).*LAT:\s*(?P<lat>\d{2,3}.\d{2,3}[N|S]).*LON:\s*(?P<lon>\d{2,3}.\d{2,3}[W|E]).*DEP:\s*(?P<dep>\d{2,3}.\d)\s*(?P<dep_err>\d{1,3}.\d);.*M0=\s*(?P<M0>\d.\d{1,2}\*\d{1,2}\*\*\d{1,2}).*STRIKE=(?P<strike>\d{1,3}).*DIP=(?P<dip>\d{1,3}).*SLIP=\s*(?P<slip>[-|+]\d{1,3}).*NP2",re.MULTILINE|re.DOTALL) 
r = regex.search(content) 
data = r.groupdict() 

headers = ['name', 'date', 'time', 'lon', 'lat', 'dep', 'dep_err', 'Mw', 'M0', 'strike', 'dip', 'slip'] 
wb = Workbook() 
ws = wb.add_sheet('Quakes') 

column = 0 
for header in headers: 
    ws.write(0, column, header) 
    ws.write(1, column,data[header]) 
    column+=1 
wb.save('quakes.xls') 

あなたは

+0

これは非常に素晴らしいソリューション@craigsです。問題は、はい、私はhtmlを使用する必要があります(@Abizernに対する私の回答を見てください)。 –

関連する問題