読者です 読者をやめる 読者になる 読者になる

Wikipediaから日本全国の駅一覧を取得するスクリプト

駅データ.jpにて全国の駅データをcsvで無料ダウンロードできるが、残念なことに駅名の読み方(ふりがな)は有料版でしか付いてこない

4000円払うのもうーんって感じなので我らのWikipediaから抽出できないかやってみた。

使用言語はRuby。一覧はこのぺーじから50音順。

相月駅(あいづきえき)
会津高原尾瀬口駅(あいづこうげんおぜぐちえき)

のようなやつは駅(*)で正規表現で抽出すればおkだけど

愛野駅 (静岡県)(あいのえき・東海旅客鉄道東海道本線)
愛野駅 (長崎県)(あいのえき・島原鉄道)

とか

あかぢ駅#ふりがななしver
曙町東町停留場(あけぼのちょうひがしまちていりゅうじょう) #語尾が停留場

とか例外が多くて苦労した 以下スクリプト

require 'nokogiri'
require 'open-uri'
require 'json'

result = []
parent = Nokogiri::HTML(open('http://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC%E3%81%AE%E9%89%84%E9%81%93%E9%A7%85%E4%B8%80%E8%A6%A7'))
links = parent.xpath('//a')#全リンク取得
links.each do |link|
    url = link.attr("href")
    if(!url.nil? && url.include?("%E6%97%A5%E6%9C%AC%E3%81%AE%E9%89%84%E9%81%93%E9%A7%85%E4%B8%80%E8%A6%A7_"))#「日本の鉄道駅一覧_」を含むリンク対象
        html = Nokogiri::HTML(open("http://ja.wikipedia.org#{url}"))
        html.css('li').each do |str|
            if name = str.text.match(/(.+[駅|停留場]).*(.+)/)
                result << {name[1] => name[2].match(/(.+[えき|じょう]).*/){$1}}
            #ひらがなのみ等ふり仮名を振られていない駅名対策
            elsif name = str.text.match(/(.+)$/){$1}
                result << {name => name.gsub(/$/, "えき").tr("ァ-ン", "ぁ-ん")}
            end
        end
    end
end
#要対策 括弧が全角スペースの駅
result << {"安針塚駅"=>"あんじんづかえき"}
result << {"福生駅"=>"ふっさえき"}
result << {"花山駅"=>"はなやまえき"}
File.write('result.json', JSON.pretty_generate(result.uniq))