Html Agility Packを使ってXPathでWebページをスクレイピングする

NuGetでHtml Agility Packを追加。

例(VB.NETコード)

Sub Main()
  Console.WriteLine("HttpClientクラスで取得したWebページを解析する(Html Agility Pack)")
  ' 時間計測用のタイマー
  Dim timer = New System.Diagnostics.Stopwatch()
  timer.Start()

  ' .NET TIPSの日付順インデックスのURL(シフトJISのページ)
  Dim webUri As Uri = New Uri("http://www.atmarkit.co.jp/ait/subtop/features/dotnet/index_date.html")
  ……省略……
  Dim htmlText As String = ……省略(Webページの内容を文字列として取得)……
  Console.WriteLine("HTML取得完了: {0:0.000}秒", timer.Elapsed.TotalSeconds)

  If (htmlText IsNot Nothing) Then
    ' HtmlDocumentオブジェクトを構築する
    Dim htmlDoc = New HtmlAgilityPack.HtmlDocument()
    htmlDoc.LoadHtml(htmlText)
    Console.WriteLine("HtmlDocument構築完了: {0:0.000}秒", timer.Elapsed.TotalSeconds)

    ' 目的の<a>要素を全て取り出して(XPath)、
    ' そのhref属性とInnerTextを持つ匿名型オブジェクトのコレクションを作る(LINQ)
    Dim articles _
      = htmlDoc.DocumentNode _
        .SelectNodes("//div[@class=""da-tips-index-target""]/div[not(@class)]/a") _
        .Select(Function(a) New With _
                            {
                              .Url = a.Attributes("href").Value.Trim(),
                              .Title = a.InnerText.Trim()
                            })
    Console.WriteLine("タイトル取り出し完了: {0:0.000}秒", timer.Elapsed.TotalSeconds)
    Console.WriteLine()

    ' 先頭10件を表示する
    Console.WriteLine("記事タイトル先頭10件(全{0}記事中)", articles.Count())
    For Each a In articles.Take(10)
      Console.WriteLine(a.Title)
      Console.WriteLine(" - {0}", a.Url)
    Next
  End If
#If DEBUG Then
  Console.ReadKey()
#End If
End Sub

インストールされている Microsoft .NET Framework のバージョンおよび Service Pack のレベルを確認する方法

レジストリを見る


.NET Framework Service Pack のレベル レジストリ キー名
4.6.2 元のリリース
  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client
  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full
名前: リリース

種類: REG_DWORD

データ :
  • Windows 10 Anniversary Update の場合: 394802
  • 他のすべての OS バージョンの場合: 394806
4.6.1 元のリリース
  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client
  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full
名前: リリース

種類: REG_DWORD

データ :
  • Windows 10 Anniversary Update システムの場合: 394254
  • 他のすべての OS バージョンの場合: 394271
4.6 元のリリース
  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client
  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full
名前: リリース

種類: REG_DWORD

データ :
  • Windows 10 更新プログラムの場合: 393295
  • 他のすべての OS バージョンの場合: 393297
4.5.2 元のリリース
  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client
  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full
名前: リリース

種類: REG_DWORD

データ : 379893
4.5.1 元のリリース
  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client
  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full
名前: リリース

種類: REG_DWORD

データ :
  • Windows 8.1 または Windows Server 2012 R2 の場合: 378675
  • Windows 8、Windows 7 SP1、または Windows Vista SP2 の場合: 378758
4.5 元のリリース
  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client
  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full
名前: リリース、種類: REG_DWORD、データ: 378389
4 - クライアント 元のリリース HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client 名前: インストール、種類: REG_DWORD、データ: 1
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client 名前: バージョン、種類: REG_SZ、データ: 4.0.30319.0
4 - フル 元のリリース HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full 名前: インストール、種類: REG_DWORD、データ: 1
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full 名前: バージョン、種類: REG_SZ、データ: 4.0.30319.0
3.5 元のリリース HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5 名前: インストール、種類: REG_DWORD、データ: 1
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5 名前: SP、種類: REG_DWORD、データ: 0
3.5 Service Pack 1 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5 名前: インストール、種類: REG_DWORD、データ: 1
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5 名前: SP、種類: REG_DWORD、データ: 1
3.0 元のリリース 次の文書の展開と検出のガイダンスに従う: http://msdn.microsoft.com/ja-jp/library/aa480173.aspx
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.0 名前: SP、種類: REG_DWORD、データ: 0
3.0 Service Pack 1 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.0 名前: インストール、種類: REG_DWORD、データ: 1
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.0 名前: SP、種類: REG_DWORD、データ: 1
3.0 Service Pack 2 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.0 名前: インストール、種類: REG_DWORD、データ: 1
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.0 名前: SP、種類: REG_DWORD、データ: 2
2.0 元のリリース HKEY_LOCAL_MACHINE\Software\Microsoft\NET Framework Setup\NDP\v2.0.50727 名前: インストール、種類: REG_DWORD、データ: 1
    HKEY_LOCAL_MACHINE\Software\Microsoft\NET Framework Setup\NDP\v2.0.50727 名前: SP、種類: REG_DWORD、データ: 0
2.0 Service Pack 1 HKEY_LOCAL_MACHINE\Software\Microsoft\NET Framework Setup\NDP\v2.0.50727 名前: インストール、種類: REG_DWORD、データ: 1
    HKEY_LOCAL_MACHINE\Software\Microsoft\NET Framework Setup\NDP\v2.0.50727 名前: SP、種類: REG_DWORD、データ: 1
2.0 Service Pack 2 HKEY_LOCAL_MACHINE\Software\Microsoft\NET Framework Setup\NDP\v2.0.50727 名前: インストール、種類: REG_DWORD、データ: 1
    HKEY_LOCAL_MACHINE\Software\Microsoft\NET Framework Setup\NDP\v2.0.50727 名前: SP、種類: REG_DWORD、データ: 2
1.1 (32 ビット版オペレーティング システム上で) 元のリリース HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v1.1.4322 名前: インストール、種類: REG_DWORD、データ: 1
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v1.1.4322 名前: SP、種類: REG_DWORD、データ: 0
1.1 (32 ビット版オペレーティング システム上で) Service Pack 1 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v1.1.4322 名前: インストール、種類: REG_DWORD、データ: 1
1.1 (64 ビット版オペレーティング システム上で) 元のリリース HKLM\SOFTWARE\Wow6432Node\Microsoft\NET Framework Setup\NDP\v1.1.4322 名前: インストール、種類: REG_DWORD、データ: 1
    HKLM\SOFTWARE\Wow6432Node\Microsoft\NET Framework Setup\NDP\v1.1.4322 名前: SP、種類: REG_DWORD、データ: 0
1.1 (64 ビット版オペレーティング システム上で) Service Pack 1 HKLM\SOFTWARE\Wow6432Node\Microsoft\NET Framework Setup\NDP\v1.1.4322 名前: インストール、種類: REG_DWORD、データ: 1
    HKLM\SOFTWARE\Wow6432Node\Microsoft\NET Framework Setup\NDP\v1.1.4322 名前: SP、種類: REG_DWORD、データ: 1
1.0 (Windows XP Media Center および Tablet PC 以外のサポートされているプラットフォーム上で) 元のリリース



HKEY_LOCAL_MACHINE\Software\Microsoft\Active Setup\Installed Components\{78705f0d-e8db-4b2d-8193-982bdda15ecd}

 
名前: バージョン、種類: REG_SZ、データ: 1.0.3705.0
1.0 (Windows XP Media Center および Tablet PC 以外のサポートされているプラットフォーム上で) Service Pack 1



HKEY_LOCAL_MACHINE\Software\Microsoft\Active Setup\Installed Components\{78705f0d-e8db-4b2d-8193-982bdda15ecd}

 
名前: バージョン、種類: REG_SZ、データ: 1.0.3705.1
1.0 (Windows XP Media Center および Tablet PC 以外のサポートされているプラットフォーム上で) Service Pack 2



HKEY_LOCAL_MACHINE\Software\Microsoft\Active Setup\Installed Components\{78705f0d-e8db-4b2d-8193-982bdda15ecd}

 
名前: バージョン、種類: REG_SZ、データ: 1.0.3705.2
1.0 (Windows XP Media Center および Tablet PC 以外のサポートされているプラットフォーム上で) Service Pack 3



HKEY_LOCAL_MACHINE\Software\Microsoft\Active Setup\Installed Components\{78705f0d-e8db-4b2d-8193-982bdda15ecd}

 
名前: バージョン、種類: REG_SZ、データ: 1.0.3705.3
1.0 (Windows XP Media Center 2002/2004 および Tablet PC 2004 に同梱) Service Pack 2



HKEY_LOCAL_MACHINE\Software\Microsoft\Active Setup\Installed Components\{FDC11A6F-17D1-48f9-9EA3-9051954BAA24}

 
名前: バージョン、種類: REG_SZ、データ: 1.0.3705.2
1.0 (Windows XP Media Center 2005 および Tablet PC 2005 に同梱) Service Pack 3



HKEY_LOCAL_MACHINE\Software\Microsoft\Active Setup\Installed Components\{FDC11A6F-17D1-48f9-9EA3-9051954BAA24}

 
名前: バージョン、種類: REG_SZ、データ: 1.0.3705.3

C# で enum と int 、 string を 相互 に 変換 する 方法

列挙型(enum) → 文字列(string)

var enmVal = Season.Spring;
var strVal = Enum.GetName(typeof(Season), enmVal);

列挙型(enum) → 数値(int)

var enmVal = Season.Autumn | Season.Winter;
var intVal = (int)enmVal;

文字列(string) → 列挙型(enum)

var strVal = "spring, summer";
var enmVal = (Season)Enum.Parse(typeof(Season), strVal, true);

数値(int) → 列挙型(enum)

var intVal = 2;
var enmVal = (Season)Enum.ToObject(typeof(Season), intVal);

C#/VB.netですべての例外をキャッチする

vb.net

Try
    'ファイルを開く
    sr = System.IO.File.OpenText(filePath)
Catch ex As System.IO.FileNotFoundException
    System.Console.WriteLine(ex.Message)
    Return Nothing
Catch ex As System.IO.IOException
    System.Console.WriteLine(ex.Message)
    Return Nothing
Catch ex As System.UnauthorizedAccessException
    System.Console.WriteLine(ex.Message)
    Return Nothing
Catch ex As System.Exception
    'すべての例外をキャッチする
    '例外の説明を表示する
    System.Console.WriteLine(ex.Message)
    Return Nothing
End Try

C#

try
{
    //ファイルを開く
    sr = System.IO.File.OpenText(filePath);
}
catch (System.IO.FileNotFoundException ex)
{
    System.Console.WriteLine(ex.Message);
    return null;
}
catch (System.IO.IOException ex)
{
    System.Console.WriteLine(ex.Message);
    return null;
}
catch (System.UnauthorizedAccessException ex)
{
    System.Console.WriteLine(ex.Message);
    return null;
}
catch (System.Exception ex)
{
    //すべての例外をキャッチする
    //例外の説明を表示する
    System.Console.WriteLine(ex.Message);
    return null;
}

C#でGoogleカレンダーからAPIで日本の祝日を取得する

Newtonsoft.Json 使います。

        public static HashSet<DateTime> GetHolidays(int year)
        {
            var key = "あなたのAPIキー";
            var holidaysId = "japanese__ja@holiday.calendar.google.com";
            var startDate = new DateTime(year, 1, 1).ToString("yyyy-MM-dd") + "T00%3A00%3A00.000Z";
            var endDate = new DateTime(year, 12, 31).ToString("yyyy-MM-dd") + "T00%3A00%3A00.000Z";
            var maxCount = 30;

            var url = $"https://www.googleapis.com/calendar/v3/calendars/{holidaysId}/events?key={key}&timeMin={startDate}&timeMax={endDate}&maxResults={maxCount}&orderBy=startTime&singleEvents=true";
            var client = new WebClient() { Encoding = System.Text.Encoding.UTF8 };
            var json = client.DownloadString(url);
            client.Dispose();

            var o = Newtonsoft.Json.Linq.JObject.Parse(json);
            var days = o["items"].Select(i => DateTime.Parse(i["start"]["date"].ToString()));
            return new HashSet<DateTime>(days);
        }