2012-05-03 5 views
5

私はPythonライブラリBeautiful Soupを.NETに移植する可能性を検討しています。主に、パーサーが大好きで、.NETフレームワークには優れたHTMLパーサーがありません(Html Agility Packは古くなっていて、文書化されておらず、正確なスキーマがわからないと正常に動作しません)。非常にPythonesqueなライブラリを.NETに移植する

私の主な目標は、基本的なDOM選択機能をBeautifulSoupの美しさとシンプルさに匹敵するようにして、開発者が探している要素を簡単に見つけることができるようにすることです。

BeautifulSoupは、ルーズバインディングと名前付きパラメータを利用してこれを実現します。例えば、testidと言葉FOOが含まれていtitleを持つすべてのaタグを見つけるために、私が行うことができます:

soup.find_all('a', id='test', title=re.compile('foo')) 

しかし、C#が名前の任意の数の概念がありません。要素。 .NET4ランタイムには名前付きパラメータがありますが、既存のメソッドプロトタイプと一致する必要があります。

私の質問:このPython構造と最もよく似たC#デザインパターンは何ですか?

いくつかのアイデアは:

私は、開発者として、コーディングしたいかに基づいて、この後に行きたいと思います。これを実装することはこの記事の範囲外です。私が持っている一つのアイデアは、匿名のタイプを使用することです。次のようなものがあります。

soup.FindAll("a", new { Id = "Test", Title = new Regex("foo") }); 

この構文はPythonの実装と大まかには一致しますが、まだいくつかの欠点があります。

  1. FindAll実装では、匿名型を解析するためにリフレクションを使用し、任意のメタデータを妥当な方法で処理する必要があります。
  2. FindAllプロトタイプにはObjectが必要です。これは、文書化された動作に精通していない限り、このメソッドの使用方法がかなり不明確です。 の匿名タイプにする必要があるメソッドを宣言する方法はないとは思いません。

私が持っていたもう1つのアイデアは、これを処理する.NETの方法ですが、ライブラリのPythonのルーツから遠く離れています。それは流暢なパターンを使用することです。何かのように:

soup.FindAll("a") 
    .Attr("id", "Test") 
    .Attr("title", new Regex("foo")); 

これは、式ツリーを構築し、適切なノードをDOMに配置する必要があります。

私が持っている最後のアイデアは、LINQを使用することです。私はC#、またはこのような状況に対処するための最良の方法でちょうど全体的な勧告にPythonのコードを移植経験を持つ誰からも任意の洞察力をいただければと思います

var nodes = (from n in soup 
      where n.Tag == "a" && 
      n["id"] == "Test" && 
      Regex.Match(n["title"], "foo").Success 
      select n); 

:のようなもの。

+7

私はPythonが大好きです。常にそれを使用する聴衆を目指してください。 .NET用に作成する場合は、使用するスタイルで行います。既存の.NETライブラリを見て、そのプラクティスが何であるかを知る(または誰かがここであなたに伝えるのを待つ)、それらを使用する - Pythonバージョンを試してみたり、Pythonを使用したりしないでください。 –

+0

私はLattywareに同意します。 C#のBeautifulSoupを使いたいのであれば、IronPyhonで実行することはできませんか? – mata

+0

これはXPathの目的ではありませんか? –

答えて

1

IronPythonエンジン内でコードを実行しようとしましたか。私が知っている限り、実際にうまくいくので、Pythonコードに触れる必要はありません。

+1

これは素晴らしいアイデアですが、C#で名前付きのパラメータを使用してPythonで実装されたメソッドを呼び出す方法の例を見たいと思います。 IronPythonはこのシナリオで相互運用性の話を提供しますか?また、これを行うことで、基本的に「.NETでPythonライブラリを使用するにはどうすればよいですか?それは私が求めていたものではありません。 –

関連する問題