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

酢ろぐ!

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

C#でHtml Agility Packを使って秀和システムの新刊情報を取得する

Web C#

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

今日もリスト形式で並んでいるデータを取得してみましょう。過去に「Windows Phoneアプリ開発入門」でも題材に使った秀和システムの新刊情報をスクレイピングしてみましょう

f:id:ch3cooh393:20141204104009p:plain

昨日の記事とほとんどやっていることは同じですが、昨日はtableタグ上のデータを取得したのに対して、今日はdlとdtタグのデータになります。

// 新刊情報を取得したいサイトのURL
var urlstring = "http://www.shuwasystem.co.jp/newbook.html";

// 指定したサイトの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);
}

// 最初のsinkanがコンピュータの関連書籍
var priceNode = doc.DocumentNode.Descendants("div")
    .Where(n => n.GetAttributeValue("id", string.Empty) == "sinkan")
    .First();

// 必要な情報を読み取る
var listItems = priceNode.Descendants("dl")
    .Select(n =>
    {
        // 書籍のタイトルを取得する
        var title = n.SelectSingleNode("dt")
            .InnerText.Trim();

        // 書籍のISBNを取得する
        var isbn = n.SelectSingleNode("dd/p/strong")
           .InnerText.Trim();

        return new { Title = title, Isbn = isbn };
    });


// 結果を出力する
listItems.ToList().ForEach(item => 
{
    Debug.WriteLine("{0} ({1})", item.Title, item.Isbn);
});

関連記事

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