酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

C#でHtml Agility Packを使って豊橋技科大の休講情報を取得する

この記事は「TUT Advent Calendar 2014」の3日目です。たまたまAdventarで発見した豊橋技術科学大学関係者向けのアドベントカレンダーで、3日目が空いていたので学外の人ですが参加してみます。

Html Agility Packという.NET Framework向けに書かれたHTMLパーサーライブラリがあります。このライブラリはC#から利用することができます。簡単にウェブスクレイピングすることができます。

豊橋技術科学大学の休講情報を試しにパースしてみましょう。TUT休講情報botが存在しているので、学内の方もおそらく同じようにスクレイピングしているのではないかと思いますが、休講情報は下図のようにとても綺麗なTable構造になっています。

f:id:ch3cooh393:20141203014038p:plain

このページには休講情報と補講情報とが掲載されているのですが、ここでは休講情報に絞りたいので休講情報が掲載されているテーブル部分をXPathを指定して取得し、そこからLINQのSelectメソッドを使って、trタグ別に分割して取得処理を実行したいと思います。

以下、サンプルコードです。

// 休講情報を取得したいサイトのURL
var urlstring = "https://www.ead.tut.ac.jp/board/main.aspx";

// 指定したサイトのHTMLをストリームで取得する
var doc = new HtmlAgilityPack.HtmlDocument();
using (var client = new HttpClient())
using (var stream = await client.GetStreamAsync(new Uri(urlstring)))
{
    // HtmlAgilityPack.HtmlDocumentオブジェクトにHTMLを読み込ませる
    doc.Load(stream, Encoding.UTF8);
}

// XPathを指定して休講情報テーブル部分を取得する
var items = doc.DocumentNode.SelectNodes("//*[@id=\"grvCancel\"]/tr")
    .Skip(1)
    .Select(item =>
    {
        // td単位で複数のデータを取得する
        var data = item.SelectNodes("td");

        // 休講日
        var date = data.ElementAt(1).InnerText;

        // 時限
        var period = data.ElementAt(2).InnerText;

        // 授業の名前
        var subject = data.ElementAt(3).InnerText;

        return new { Date = date, Period = period, Subject = subject };
    });

// 取得した休講情報を出力する
items.ToList().ForEach(item =>
{
    Debug.WriteLine("{0}({1}) {2}", item.Date, item.Period, item.Subject);
});

上記のサンプルコードを実行した結果です。C#とHtml Agility Packを使えば、とても簡単に休講情報を得ることができます。

f:id:ch3cooh393:20141203014802p:plain

これらの休講情報を元にTwitterで呟くbotを作りたいな……と考えている方が居れば、こちらの記事も参考にしてみてください。

明日は……

ごめんなさい。どなたなのでしょう……

関連記事

このブログでHtml Agility Packについて取り扱った記事をピックアップしました。