2015年1月5日月曜日

簡単にhtmlファイルの取得解析を行う方法 (.net)

一昔前であれば、HttpWebRequestなどを利用して自前でhttp通信を確立して
文字データを取得して、その後加工。なんて方法しか思い浮かばなかったのですが
今ではライブラリも相当充実し、簡単な記述で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 件のコメント: