Webスクレイピングライブラリ(HtmlAgilityPack)について説明していきます。
アグリモの製品では、日報データ自動取得システムDT、検索データ自動取得システムDTで、SgmlReader の代用として置き換えることを検討しましたが、現在も置き換えには至っておりません。
用途としては、SgmlReader と同じく、HTMLをXMLにパースするために用います。先にも述べましたが、HTMLは結構記述ミスが多く、そのままXMLとして用いることが出来ませんので、XMLパーサーが必要になります。使ってみた感じでは、生成されたXMLを LINQ to XML を用いて構文解析を行う際にエラーが出て落ちたりすることがあるように思いました。
綺麗なHTMLだと別に問題ありませんが、行儀の悪いHTMLでも落ちないことが重要ですので、アグリモでは今も SgmlReader の方を採用しています。
1.新規にソリューションを作成します。
2.パッケージマネージャーコンソールで、「Install-Package HtmlAgilityPack」と入力して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 |
WebBrowser browser = new WebBrowser(); var htmlDoc = new HtmlAgilityPack.HtmlDocument(); htmlDoc.LoadHtml(browser.DocumentText); for(int i = 1; i < 9; i ++) { string name = htmlDoc.DocumentNode .SelectNodes(string.Format("//*[@id=\"contentsBodyKaiinDetail\"]/form/table[2]/tbody/tr/td/table/tbody/tr[2]/td[2]", i)) .First() .InnerText; MessageBox.Show("name = " + name); } var nodes = htmlDoc.DocumentNode.Descendants("input") .Select(y => y.Descendants() .Where(x => x.Attributes["class"].Value == "box")) .ToList(); foreach (var n in nodes) { MessageBox.Show("node = " + n); } |