ケッタイなこと頼まれましてね。
えとね、たとえばこんな数枚のWeb-pageがあったとするやないですか。
とか とか。
最初のページのURLあげるから、
「リンクを次々に辿りながらtable内の<td>~</td>を拾って一本の表を仕立ててくれ」
ってんですよ。
こんな感じで。
つまりこの、HTMLを解析しぃのページ上のリンクをつつきぃの、そゆこと自動でやってくれと。
んで僕が目を付けたのが selenium てゆー Web-アプリのTestTool.
seleniumはブラウザ上での人の操作を記録し、play-backしてくれます。
面白いことに、このseleniumを外から(.NETやらJavaやらPHPやらRubyやらで)
リモコン操作できるんす。
こいつを使ってページを渡り歩き、seleniumが読みだしたHTMLをパーサで解析してます。
.NET Frameworkには出来合いのHTMLパーサがなさげ(よね?)なので、
「すまんけどXHTMLなページ限定」と念を押してXML-domパーサ使いました。
”GET”ボタン押すと↓こんなのが動きます。 40行で書けちゃったですよ。
- private void btnGET_Click(object sender, EventArgs e)
- {
- string serverURL = "localhost";
- int serverPort = 4444;
- string targetBrowser = "*firefox";
- string targetURL = "http://www1.c3-net.ne.jp/episteme/";
- selenium = new Selenium.DefaultSelenium(serverURL, serverPort, targetBrowser, targetURL);
- selenium.Start();
-
- selenium.Open("/episteme/CodeZine/trial.html");
- while ( true ) {
- StringBuilder builder = new StringBuilder("<?xml version='1.0' ?>");
-
- builder.Append("<html>");
- string html = selenium.GetHtmlSource();
- int startpos = html.IndexOf("<body");
- int endpos = html.IndexOf("/body>") + 6;
- builder.Append(html, startpos, endpos - startpos);
- builder.Append("</html>");
-
- XmlDocument document = new XmlDocument();
- document.Load(new StringReader(builder.ToString()));
-
- foreach ( XmlNode row in document.DocumentElement.GetElementsByTagName("tr") ) {
- ListViewItem item = null;
- bool first = true;
- foreach (XmlNode node in row.ChildNodes) {
- if (node.Name != "td") break;
- if (first) item = new ListViewItem(node.InnerText)
- else item.SubItems.Add(node.InnerText);
- first = false;
- }
- if ( item != null ) lstTable.Items.Add(item);
- }
-
- if (selenium.IsTextPresent("これでおしまい")) break;
-
- selenium.Click("link=こちら");
- selenium.WaitForPageToLoad("30000");
- }
- selenium.Stop();
- }