#freeze
[[.NET]]
スクレイピングって面白いわよね。わたしは [[Ruby]] でよくやるのだけど、[[.NET]] でもできるわ。
たぶん VS2010ではダメ。VS2013以降ならイケると思うの。HtmlAgilityPack を使うのがいいわ。
* HtmlAgilityPack の導入(VS2013) [#t20fa8b1]
- 『プロジェクト』→『NuGetパッケージの管理』を開いて。
- 『オンライン』で「HtmlAgilityPack」で検索すると出てくるから『インストール』して。
- 既にインストールずみで参照をつける時も、この手順でいいみたい。なんかちょっとキモ。
* 書いてみましょうか。 [#ka6374d4]
ダウンロードはめんどくさいから、webBrowserで落とす事にしたわ。そこいらは手抜きね。
サンプルサイトは、[[ここ>http://calendar.infocharge.net/cal/2016/]]。2016年の祝日をもらってきましょう。
namespace web002
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
textBox1.Text = "http://calendar.infocharge.net/cal/2016/";
if (textBox1.Text != "")
{
button1.Enabled = false;
webBrowser1.Url = new Uri(textBox1.Text);
}
}
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
button1.Enabled = true;
HtmlAgilityPack.HtmlDocument html = new HtmlAgilityPack.HtmlDocument();
html.LoadHtml(webBrowser1.DocumentText);
var articles = html.DocumentNode.SelectNodes(@"//tr/td")
.Select(a=>new{
Html = a.InnerHtml
});
textBox2.Text = "";
List<string> ss = new List<string>();
foreach (var a in articles)
{
string kg = "\r\n";
if (Regex.IsMatch(a.Html, @"^[0-9]", RegexOptions.IgnoreCase) == true)
{
kg = "\t";
}
string x1 = a.Html + kg;
textBox2.Text += x1;
}
}
}
}
さすが簡単ねえ。
ちなみに単発データの取得だと、以下かしら?
HtmlAgilityPack.HtmlNode node = doc.DocumentNode.SelectSingleNode(xpath);
* ここのデータを使わせてもらいました。 [#ib235b60]
: 日本の祝日カレンダー(2016) | http://calendar.infocharge.net/cal/2016/