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

なか日記

一度きりの人生、楽しく生きよう。

SGMLReaderで「えひめFreeWi-Fi」サービス提供箇所をスクレイピング

愛媛県では県主導の「えひめFreeWi-Fi」という無料WiFiサービスが提供されています。

提供されている場所は以下のページに載っているのですが、ただのリストなので非常にわかりづらいです。

というわけで、第一歩としてこのデータを抜き出してみたいと思います。

Html Agility Pack

C#で使えるHTMLパーサといえば、Html Agility Pack がありますが、これを使ったやり方は酢酸先生のブログを見もらったらいいと思います。

SGMLReader

今回はSGMLReaderを使ってみたいと思います。

サンプル

static void Main(string[] args)
{
    var urlString = "http://www.pref.ehime.jp/h12600/wifi/osirase260822.html";

    XDocument xml;
    using (var sgml = new SgmlReader() { Href = urlString, IgnoreDtd = true })
    {
        xml = XDocument.Load(sgml);
    }

    var ns = xml.Root.Name.Namespace;
    var spots = xml.Descendants(ns + "table")
        .Last()
        .Descendants(ns + "tr")
        .Skip(1) // タイトルをスキップ
        .Select(e => e.Elements(ns + "td").ToList())
        .Select(x => new
        {
            Place = x[1].Value,
            Address = x[2].Value,
            ServiceProvider = x[3].Value
        });

    foreach (var spot in spots)
    {
        Console.WriteLine("施設/箇所名:{0} 住所:{1} サービス提供事業者:{2}",
            spot.Place, spot.Address, spot.ServiceProvider);
    }
}

最初の using の部分で SgmlReader を使って XDocument を取得し、後は Html to Xml でごにょごにょしてます。

ね、簡単でしょう?*1

参考にさせてもらった記事

SgmlReader 自体は酢酸先生から教えてもらいました。

そこから蜜葉たんのブログを経由して、

neueさんのブログで何となくわかった気になった感じです。

*1:Html to Xml ほとんど使ったことないので実はよくわかってない…