私はPythonライブラリBeautiful Soupを.NETに移植する可能性を検討しています。主に、パーサーが大好きで、.NETフレームワークには優れたHTMLパーサーがありません(Html Agility Packは古くなっていて、文書化されておらず、正確なスキーマがわからないと正常に動作しません)。非常にPythonesqueなライブラリを.NETに移植する
私の主な目標は、基本的なDOM選択機能をBeautifulSoupの美しさとシンプルさに匹敵するようにして、開発者が探している要素を簡単に見つけることができるようにすることです。
BeautifulSoupは、ルーズバインディングと名前付きパラメータを利用してこれを実現します。例えば、test
のid
と言葉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の実装と大まかには一致しますが、まだいくつかの欠点があります。
FindAll
実装では、匿名型を解析するためにリフレクションを使用し、任意のメタデータを妥当な方法で処理する必要があります。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);
:のようなもの。
私はPythonが大好きです。常にそれを使用する聴衆を目指してください。 .NET用に作成する場合は、使用するスタイルで行います。既存の.NETライブラリを見て、そのプラクティスが何であるかを知る(または誰かがここであなたに伝えるのを待つ)、それらを使用する - Pythonバージョンを試してみたり、Pythonを使用したりしないでください。 –
私はLattywareに同意します。 C#のBeautifulSoupを使いたいのであれば、IronPyhonで実行することはできませんか? – mata
これはXPathの目的ではありませんか? –