[C#] HtmlDom の実力を探る…つーかパフォーマンスが悪いけど

PP-Club メンバの美崎さんのライフハッカーの記事

SimpleStyle100回突破記念~編集部が選ぶ美崎薫氏のアプリ25選 : ライフハッカー[日本版]
http://www.lifehacker.jp/2012/05/120417misakihacks.html
プログラムのソースコードから変数を出力するヘルパー『makeMessagebox』(SimpleStyle第119回) : ライフハッカー[日本版]
http://www.lifehacker.jp/2012/08/12-08-30makemessageboxsimplestyle119_1.html

をなんとか活用できないかと、美崎さん当人に相談したところ「ライフハッカーの目次って用意されていないんですよね~ orz」の返事が orz ああ、目次ないんですね、これ。

一応、当人的には、http://www42.tok2.com/home/papermoon/ なところで、自動生成を試みているらしいのですが、ちょっとこれではアレすぎて全体の見通しが付きません。CSS で適当にレイアウトすればいいんでしょうが、自動生成の精度が悪いらしくというところだそうです。

で、本格的なところはライフラッカーへのクローリングか、google api を使うのがよいのですが、ひとまず、先のページからリンクとタイトルぐらいは抜き出して Excel で整理するところまではやりたいと思う訳ですよ。なので、手順としては、

  1. 該当するページを HTML ファイルで「手動」で保存。
  2. HtmlDom を使って、リンクとタイトルを抽出する。
  3. CSVファイルへ書き出し。
  4. Excel で開いてファンクションを使って適当に整形

「手動」なところが混じっていますが、全体の作業量を考えるとなにも全体を「自動化」する必要がありませんッ!!! ってのが PP-Club の信条でして(つーか、私自身の信条)、リンクとタイトルだけを取り出せばよいわけです。

元の HTML ソース

抽出後のソース

Excel に貼りつけ

とする訳です。
実は元の HTML ソースは、

  • タイトルが重複している
  • 別のリンクも含まれている

な感じで、ちょっとプログラム的にはややこしいのです。そう、トライ&エラーが必要なのですね。
…が、HtmlDom を使うと、これぐらい簡単に書けます。

static void Main(string[] args)
{
	string path = "\\temp\\simplestyle_idx.html";

	var doc = new HtmlDocument().Load(path);
	// Aタグで「SimpleStyle 第??回」を含むものを取得
	var cont = new HtmlNavigator(doc)
		.Where(n => n.TagName == "a" &&
			n.Value.Contains("SimpleStyle 第"))
		.Select(n => new { url = n % "href", text = n.Value })
		.Distinct();

	foreach (var n in cont)
	{
		Console.WriteLine("{0}\t{1}",
			n.url, n.text);
	}
}

まあ、これも一発で書けたわけではなくて何度か書き直している訳ですが、これぐらい短いとちまちまと設計を書いているよりも何かとコードを書いたほうが早い訳です。ええ、当然「設計」が必要な場合もあるので、それの話はまた別のときに。

HtmlDom は github で
https://github.com/moonmile/XmlDom

ちなみに、ライフハッカーの SimpleStyle の目次はもうちょっと考えます。元ソース自体が、第87回までしかないのでちょっと古いので。今は120回位です。

ちなみに、現状の HtmlDom は使い物にならない位遅いので、現在パフォーマンスを調節中です。どうやら、COM -> .NET 変換のところが遅すぎるみたいなので、C++/CLI で書き直せばよいかと模索中。

カテゴリー: C#, PP-Club, XmlDom パーマリンク

[C#] HtmlDom の実力を探る…つーかパフォーマンスが悪いけど への1件のコメント

  1. masuda のコメント:

    ちなみに、google 経由のクローリングとか、twitter のクローリングは api 経由じゃなくて HTML 経由でやるために HtmlDom を作っているってのもある訳で、ちまちまと WebBrowser を立てなくても WebClient 経由で出来るのでは?ってのが別な目的。
    ただし、現状だと .NET/COM が遅いので、本格的に動かせるようになるのは C++/CLI で作ってから。

コメントは停止中です。