1

まず、間違った用語を使用したり、基本的な概念の理解に欠陥がある場合はご容赦ください。クラスを使用するスクリプトを作成する方法を学んでいます...そしてPython /コーディングの比較的初心者です。

原則として、クラス内で同じ関数を 2 回呼び出す方法があるかどうか知りたいです。私がやろうとしていることを簡単に説明すれば、それはある程度の意味があるかもしれません...

シードされたWebページを解析し、特定のパラメーターに基づいてURLを返し、それらのURLをたどり、同じことを(潜在的にn回)実行し、最終的にリンクの下部にpdfを返すWeb「スクレーパー」を作成しようとしています。これは、同僚が現在手動で行っているコンテンツの収集を高速化するためです。(私は以前の比較的基本的な繰り返しで、文字どおり数か月の手動作業を節約しました。)

これは私が現在使用している方法ですが、私が書いたコードは実際にはスケーラブルでなく、簡単に再利用することもできず、より用途の広いものにしたいと考えています (現在、各インスタンスのスクリプトを手作業で作成しています)。

(私は思う)シードURLを保持し、場所、タイトル、u:p、Cookie、およびさまざまな機能を保存するために使用するsiteInstanceというクラスを構築したいと考えています。サイトを歩き回って目的のコンテンツにたどり着くために使用します。

ターゲット URL を解析して次のレイヤーの URL を返す、繰り返し使用する関数があります。これらはいくつかのサイト固有の RegEx に基づいているため、URL のレイヤーごとに検索フィルター (regEx) をフィードする必要があることはわかっています。パーサーを再利用できるようにしたいのですが、レイヤー固有の正規表現でフィードします。DRYは当たり前ですよね?

私の考えでは、これは、siteInstance.parser と呼ばれる func があり、各 siteInstance.class 内に多数の関数を作成することを意味します (たとえばsiteInstance.parserA、レイヤー 1、siteInstance.parserBレイヤー 2、... siteInstance.parsernn 番目のレイヤー) 。

以下は単純化されたバージョンです。実際には、次のレイヤーのターゲット URL のリストを正しく生成するために、各レイヤーで多くのクリーニング/準備ステップがあります。これには、保存されたバイナリのファイル構造の作成、ログの書き込み、そのレイヤーの RegEx の起動などが含まれます。

これは 2 層の例ですが、コンテンツに少なくとも 4 つの層があるインスタンスを知っています。

例: シード {URL:www.journalTitle.com}

最初のパスの結果 (レイヤー 1): [{IssueURL2010:www.journalTitle.com/2010},{IssueURL2011:www.journalTitle.com/2011},{IssueURL2012:www.journalTitle.com/2012},{IssueURLn:www.journalTitle.com/n}]

IssueURL2010 (レイヤー 2) の場合: [{article1_2010URL:www.journalTitle.com/2010/1},{article2_2010URL:www.journalTitle.com/2010/2},{article3_2010URL:www.journalTitle.com/2010/3},{articlen_2010URL:www.journalTitle.com/2010/n}]

からarticle1_2010UR私は得ることができますwww.journalTitle.com/2010/1.pdf

これが理にかなっていることを願っています...

4

1 に答える 1

2

別のクラスで解析ロジックを定義し、インスタンス (またはクラス) 属性で数回インスタンス化するだけです。

class URLParser(object):
    def __init__(self, regexp, ...):
        self.regexp = regexp
        ...

    def parse_urls(self, urls):
        # do your URL parsing thing
        # return parsed URLs

class SiteInstance(object):
    def __init__(self, ...):
        self.parsers = [
            URLParser('regexp1'),
            URLParser('regexp2'),
            ...
        ]

    def parse(self, ...):
        ...
        for parser in self.parsers:
            parser.parse_urls(...)
于 2012-10-09T05:47:34.967 に答える