主にプログラミングに関して。Python, .NET Framework(C#), JavaScript, その他いくらか。
記事にあるサンプルやコードは要検証。使用に際しては責任を負いかねます

スポンサーサイト

                
tags:
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

正規表現を使ってHTMLから情報を抜き出す

                
tags:
Webサイトから情報を抜き出したいときがある。だけどAPIに対応していなくて、HTMLから情報を抜き出さねばならないときがある。最近、自分のサイトに為替レートを自動更新する機能を付けたかった。だけどAPIでそういった機能を提供しているところは、すべて有料だった。じゃあYahoo!の為替情報サイトを開いて、そのHTMLから為替情報を抜き出してしまおうと。

HTMLから情報を抜き出したいとなると、一つの手立てとしてHTMLパーサを使うことが思い浮かぶ。だけど僕が欲しいのは為替レートという一つの値だけだ。このためだけにパーサを使うのは仰々しい。欲しい値とその前後のパターンを見極めて、それが重複しないようなら正規表現を使った方が処理が軽い。今回欲しかったのは、以下のHTMLの断片の中で"81.310000"という値。その前にはレートを出す二国の文字コードやリクエスト発行時間とみられる値が並んでいる。

<div class="qteHeaderBGLight qte3DHeader"><div><h2 class="qteTitle yjMS">レート計算結果</h2></div></div><div class="qteContainer qteBodyBorder s150">
<table border=0 cellspacing=3 cellpadding=0 width=628 bgcolor=#FFFFFF class=yjMS><tr class=chartbg><th align=center>コード</th><th align=center>アメリカ ドル</th><th colspan=2 align=center>最新取引レート</th><th align=center>日本 円</th></tr><tr align=center><td><a href=http://stocks.finance.yahoo.co.jp/stocks/detail/?code=USDJPY=X>USDJPY=X</a></td><td>1</td><td nowrap>15:19</td><td>81.310000</td><td><b>81.31</b></td></tr></table></div>

リクエスト毎に異なる値は、リクエスト発行時間と、時間で変動する為替レートだ。そこを適切な正規表現で記述し、あとは前後の変わらない文字列と組み合わせればいい。というわけで上記のHTMLの断片から為替レートを抜き出す正規表現は以下。
us_currency = re.search(r"USDJPY=X</a></td><td>1</td><td nowrap>(\d+:\d+)</td><td>(\d+\.\d+)</td>", str).group(2)

正規表現を二箇所で使っている。時間表現"hh:mm"にマッチする"(\d+:\d+)"と、小数にマッチする"(\d+\.\d+))"だ。group()の引数を0にすると両方の正規表現マッチ部分とその間の文字列を含むマッチ結果が返る。同じく引数が1だと最初の正規表現にマッチする部分が返る。引数が2だと二つ目の正規表現にマッチする部分が返る。この二つ目が今回ほしい値だ。

文字列パターンを見ていると、正規表現部分は一つにおさまるとは限らない。そんなときはre.search().group()を活用していけば、望む値を抽出することができる。
            

コメントの投稿

非公開コメント

プロフィール

hMatoba

Author:hMatoba
Github

最新記事
リンク
作ったものなど
月別アーカイブ
カテゴリ
タグリスト

検索フォーム
Amazon
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。