Webスクレイピングライブラリ(SgmlReader)について説明していきます。
アグリモの製品では、日報データ自動取得システムDT、検索データ自動取得システムDTで、Webに表示された内容をCSVデータへ変換する過程で使用しています。
用途としては、C#のWebBrowserコントロールで取得されたHTMLをXMLにパースするために用います。何故そのようなことが必要かというと、HTMLは記述ミスが結構あるので、そのままXMLとして用いることが出来ません。(タグがちゃんと閉じていなかったりするので。。)そのために SgmlReaderのようなライブラリを用いて正確なXMLデータに変換することが重要になってきます。
XMLデータに変換した後は、LINQ to XML を用いて構文解析を行い、必要なデータを抽出します。
1.新規にソリューションを作成します。
2.パッケージマネージャーコンソールで、「Install-Package SgmlReader」と入力してEnterキーを押下します。
3.プロジェクトの参照にDLLが追加されます。
サンプルソース
WebBrowser browser = new WebBrowser();
TextReader tr = new StringReader(browser.DocumentText);
// setup SGMLReader
Sgml.SgmlReader sgmlReader = new Sgml.SgmlReader();
sgmlReader.DocType = "HTML";
sgmlReader.WhitespaceHandling = WhitespaceHandling.All;
sgmlReader.CaseFolding = Sgml.CaseFolding.ToLower;
sgmlReader.InputStream = tr;
//HTMLをXMLに変換
xml = XDocument.Load(sgmlReader);
//XMLの名前空間をセット
ns = xml.Root.Name.Namespace;
//LINQ to XML
var query = xml
.Descendants(ns + "table")
.Where(e => e.Attribute("id") != null && e.Attribute("id").Value == "SearchResultList")
.ElementAt(num)
.Descendants(ns + "tr")
.Where(e => e.Attribute("class") != null && (e.Attribute("class").Value == "reinsColor detail-height"))
.SelectMany(e => e.Descendants(ns + "th"));
//件数カウント
var qc = query.Count();
// 書き出し
if (qc > 0)
{
var cnt = 0;
foreach (var item in query)
{
if (++cnt % qc != 0)
{
sr1.Write("\"" + item.Value.Replace("\r\n", "").Trim() + "\",");
}
else
{
sr1.WriteLine("\"" + item.Value.Replace("\r\n", "").Trim() + "\"");
}
}
}



