5

Python ライブラリのBeautiful Soupを .NET に移植する可能性を調査しています。主な理由は、私はパーサーが大好きで、.NET フレームワークには優れた HTML パーサーがないからです (Html Agility Pack は時代遅れで、バグが多く、文書化されておらず、正確なスキーマがわからないとうまく機能しません)。

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

BeautifulSoup はこれを実現するために、緩やかなバインディングと名前付きパラメーターを利用しています。たとえば、単語fooを含むofおよび aをa持つすべてのタグを検索するには、次のようにします。idtesttitle

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

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

私の質問:この Pythonic 構造に最も類似する C# の設計パターンは何ですか?

いくつかのアイデア:

開発者としてのコーディング方法に基づいて、これを実行したいと思います。これを実装することは、この投稿の範囲外です。私が考えている 1 つのアイデアは、匿名型を使用することです。何かのようなもの:

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

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

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

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

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

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

3 番目で最後のアイデアは、LINQ を使用することです。何かのようなもの:

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

Python コードを C# に移植した経験のある方からの洞察、またはこの状況を処理するための最善の方法に関する全体的な推奨事項をいただければ幸いです。

4

1 に答える 1

1

コードを IronPython エンジン内で実行してみましたか。私が知る限り、非常にうまく機能し、Python コードに触れる必要はありません。

于 2012-05-03T16:05:00.990 に答える