2015-08-21

HTML文書の取得と変換

ウェブ上で公開されているデータの多くはファイルダウンロードの方法によって提供されていますが、中にはウェブページ (HTML文書) に記述されたテキストとして提供されているものもあります。
一般的なウェブブラウザはディスプレイに表示されたテキストのコピーをサポートしているので、ウェブページに記述されているデータをテキストエディタやExcelスプレッドシートなどに貼り付けることができます。しかし、頻繁に更新されるデータを継続的に取得したいという場合には、コピー&ペーストの累積的な手間 (コスト) も無視できません。
FMEでは、HTTPCallerによってGET, POSTなどのHTTPリクエストを発行してそのレスポンスを取得できるので、これを利用することにより、HTML文書の取得とデータの変換を自動化できる可能性があります (注)。
ここでは、防災科学技術研究所ウェブサイトで公開されている「Hi-net自動処理震源リスト」 HTML文書の取得と変換を行うワークスペース例を掲げます。
FME 2015.1.1.0 build 15515

注: 個々のウェブサイトに固有のアクセスに関する制約や文書の構造に依存する部分があるので、どのサイトであっても必ず自動化できるとは言えません。

=====
防砂科学技術研究所「Hi-net自動処理震源リスト」の取得から任意のフォーマットでの出力が可能なテーブルへの変換までを自動化する。

ソースデータ:
防災科学技術研究所ウェブサイトで公開されている「Hi-net自動処理震源リスト」 (HTML文書内に記述された固定長フォーマットのテーブル)

ウェブブラウザによるHi-net自動処理震源リストの表示例 (スクリーンショットの一部)












・Hi-net地震観測システムによる自動処理結果 (前日・当日) の震源要素が記述されており、逐次更新される。
・アクセスするにはユーザー登録をし、ユーザー名、パスワードによるログインが必要。
=====

FMEワークスペース例

























Creator: 処理を開始するためのフィーチャー (initiator) を1個作成する。
1. Hi-net自動処理震源リスト (HTML文書) を取得する。
2. HTML文書をXHTML文書に変換のうえリスト本体 (改行区切りの行の集合) を抽出する。
3. テーブルを各行に分割する。
4. 各行を列 (属性値) に分割して適切な属性名を与える。
AttributeRemover: 不要な属性を削除する。

結果: 2015年8月21日午前9時ごろに取得したデータ
上記ワークスペースに VertexCreator を追加し、座標に基づいてポイントを作成しました。
OriginTime: 震源時, OTerr: 震源時誤差(秒),
Lat: 緯度(度), Yerr: 南北誤差, Long: 経度(度), Xerr: 東西誤差(km),
Dep: 深さ(km), Derr: 深さ誤差(km), Mag: マグニチュード




















1. Hi-net自動処理震源リスト (HTML文書) を取得する
3つの HTTPCaller を使い、次の手順によって震源リストページ (HTML文書) を取得しました。これは、ウェブブラウザでログインページにアクセス、ログインしてから震源リストページに移動するという手順と全く同じです。

(1) ログインページにアクセスしてセッションを開始 (GETメソッド)
(2) ログインページにユーザー名とパスワードを送信してログイン (POSTメソッド)
(3) 震源リストページにアクセスし、そのレスポンスとしてHTML文書を取得 (GETメソッド)

ログインの仕組みはサイト固有のもので、ログインページのソースを見るだけで分かる場合と、そうでない場合があります。Hi-net自動処理震源リストは前者だったのでスムースにログインできましたが、後者の場合にはサイト管理者にログインのロジックを開示してもらえるということが自動化の大前提になります。
なお、一般公開ページならば (3) だけでHTML文書が取得できます。

以下は、HTML文書からデータ部分を抽出して任意のフォーマットでの出力が可能なテーブルに変換する処理です。

2. HTML文書をXHTML文書に変換のうえリスト本体 (改行区切りの行の集合) を抽出する
HTML文書にはデータ以外の要素も含まれるため、そこから必要なデータの部分のみを抽出する必要があります。
この例では、HTMLToXHTMLConvertor によってHTML文書をXMLとして解析が可能なXHTML文書に変換したうえで、XMLFragmenter によって震源リスト本体 (改行区切りの固定長フォーマット行の集合) を抽出しました。
関連記事: XMLの読み込み - 断片化と平坦化

3. テーブルを各行に分割する
リスト本体は改行区切りの行の集合 (ひとつの文字列) なので、それを各行に分割して1行1フィーチャー (レコード) に変換します。これは、次の2つのトランスフォーマーで行えます。
AttributeSplitter: 改行文字で分割して各行をリスト属性に格納
ListExploder: リスト属性を展開して1行1フィーチャーに変換
関連記事: 文字列の分割とリスト属性の展開

4. 各行を列 (属性値) に分割して適切な属性名を与える
Tester によって先頭の行 (ヘッダ) を除外した後、AttributeSplitter によって行を列に分割して各列の値をリスト属性に格納し、AttributeCreator によってリストの各要素をそれぞれ適切な名前の属性にコピーしました。リスト属性の要素を非リスト属性に変換するのには、AttributeCopier や AttributeRenamer も使えます。

HTTPCallerはHTML文書の取得だけでなく、ウェブサーバーからのファイルのダウンロードにも使えます。
e-Stat (政府統計の総合窓口) や国土数値情報ダウンロードサービスではデータカタログ情報をXMLあるいはJSON形式で取得するためのAPIの公開が始められていますが、FMEではXMLもJSONも解析できるので、HTTPCallerを使ってカタログ情報の取得からデータダウンロードまでを自動化するワークスペースも作成できそうです。

文字列の処理は複雑に見えるかも知れませんが、変換前の文字列の構造になんらかの規則性があれば、分割、連結、置換などひとつひとつは単純な処理を組み合わせることによってどのようにでも変換できます。そして、一般的なテーブルへの変換までができてしまえば、任意のフォーマットのファイルあるいはデータベースに出力したり、位置情報があればそれに基づいてジオメトリを作成したりすることは容易です。

0 件のコメント:

コメントを投稿