HTML または XML 構造を処理する Python (2.7) クラスを拡張したいと考えています。現在、私は bs4 をいじっていますが、それはおそらくこの質問には不可欠ではありません。
より高度な操作を行う関数を追加したいと考えています。たとえば、テーブルの列全体を操作したり、リストのサブ要素をソートしたりします。そのため、サブクラスを定義します
class myBS4 (bs4.BeautifulSoup):
def sortChildren(self, keyPath,...):
...
ここまでは順調です。ただし、元のクラス (および Tag、NavigableString などの関連クラス) には、「タグ」(要素) を作成する new_tag()、NavigableString (テキスト ノード) を作成する new_string() など、bs4 オブジェクトをインスタンス化するさまざまなメソッドが既にあります。 )など。DOMベースのクラス、またはおそらく再帰的なデータ構造を処理するパッケージと同じです。
それは、bs4 関連のオブジェクトをインスタンス化するすべての bs4 関連のクラスのすべての場所を見つけ、サブクラス化し、オーバーライドして、代わりにすべてのクラスをインスタンス化する必要があるということですか? それはひどく退屈に思えます。
さらに悪いことに、微妙なバグが発生しやすいようです。たとえば、bs4 コンストラクターは、解析された HTML または XML から準 DOM ツリーを構築します。ただし、そうしている間に new_tag() を呼び出す場合と呼び出さない場合があります。のようなことを言うだけかもしれません
x = Tag("div")
その場合、BeautifulSoup および Tag および NavigableString オブジェクトのインスタンスを取得し、myBS4 および myTag および myNavigableString オブジェクトのツリーに混合します。拡張されていないノードで拡張操作を実行するように要求された場合、呼び出しは失敗します。
そのため、new_tag() などをオーバーライドするだけでは不十分な場合があります。すべてのケースを取得したかどうかを知る唯一の方法は、bs4 実装全体を調査 (または grep) することです。また、bs4 自体に触れる概念的な理由がまったくないにもかかわらず、bs4 の更新によってそれが壊れる可能性がかなり高いかもしれません。
この問題を回避するクリーンな方法はありますか? ミックスインについて考えましたが、私が知る限り、ミックスインを取り込むにはまだ bs4 をサブクラス化する必要があるため、役に立ちません。私は何かを完全に見逃していますか?