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が追加されます。
サンプルソース
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
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() + "\""); } } } |