4.SgmlReader (Webスクレイピングライブラリ)

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() + "\"");
        }
    }
}