文字データを取得して、その後加工。なんて方法しか思い浮かばなかったのですが
今ではライブラリも相当充実し、簡単な記述でhtmlファイルを操作できるようになっていました。
SGMLReader
https://www.nuget.org/packages/SgmlReader/これ以外にもライブラリはあると思いますが、個人的にはこれで十分。
HTML規格のベースであるSGMLのライブラリなので、DOM操作も容易です。
実装
using System.Xml.Linq;
using Sgml;
public System.Xml.Linq.XDocument getXml(string url)
{
XDocument xml;
using (var sgml = new SgmlReader() { Href = url })
{
sgml.IgnoreDtd = true; // DTDがなくても読み込みを続行する
xml = XDocument.Load(sgml); // たった3行でHtml to Xml
}
return xml;
}
Linq To Xml
汚いコードですが、ご参考に。queryを作ってeachで抜いてDataTableへ入れています。
System.Data.DataTable dt = new System.Data.DataTable();
dt.Columns.Add("DATE", System.Type.GetType("System.String"));
dt.Columns.Add("StartValue", System.Type.GetType("System.String"));
dt.Columns.Add("MaxValue", System.Type.GetType("System.String"));
dt.Columns.Add("MinValue", System.Type.GetType("System.String"));
dt.Columns.Add("EndValue", System.Type.GetType("System.String"));
System.Xml.Linq.XDocument xml = getXml(url);
var ns = xml.Root.Name.Namespace;
var query = xml.Descendants(ns + "table").Last()
.Descendants(ns + "tr")
.Skip(1) // テーブル一行目は項目説明なので飛ばす
.Select(ee => ee.Elements(ns + "td").ToList())
.Select(es => new
{
Date = es.First().Value,
StartValue=es.Skip(1).First().Value,
MaxValue = es.Skip(2).First().Value,
MinValue = es.Skip(3).First().Value,
EndValue = es.Last().Value
});
foreach ( var rec in query)
{
System.Data.DataRow dr;
dr = dt.NewRow();
dr["DATE"] = rec.Date;
dr["StartValue"] = rec.StartValue;
dr["MaxValue"] = rec.MaxValue;
dr["MinValue"] = rec.MinValue;
dr["EndValue"] = rec.EndValue;
dt.Rows.Add(dr);
}
その他
SGMLReaderは、NuGetにて取得できます。
0 件のコメント:
コメントを投稿