0

SgmlLinkExtractor ルールで、 /static/ と /otherstuff/ の間の限られた数 (たとえば 3 つ) のディレクトリのみを許可する方法はありますか? したがって、以下の例では、EX1 はクロールされませんが (/static/ と /otherstuff/ の間に 4 つのディレクトリがあるため)、EX2 はクロールされます。

EX1: http://www.domain.com/static/d1/d2/d3/d4/otherstuff/otherstuff2/bunchacrap
EX2:http:///www.domain.com/static/d1/d2/otherstuff/otherstuff2/bunchacrap

/static/ と /otherstuff/ は常に、必要なディレクトリの両側にあると仮定します。

トンさん、助けてくれてありがとう!

4

1 に答える 1

1

パラメータで正規表現を使用するか、allowパラメータでテスト関数を使用できprocess_valueます。(ドキュメントを参照してください。)

どちらにも長所と短所があり、ページ内のリンクがどのように見えるかによって異なります。正規表現を使用する場合は、完全修飾 URL (つまり、http://domain.com/foo/bar ) に対してテストします。このパラメーターを使用するprocess_valueと、Web ページで見つかった生の値が取得されます (つまり、/foo/bar またはさらに悪い場合は相対リンク)。

たとえば、正規表現は次のようにdomain.com/(?:\w+/){1,3}\w+$一致します

domain.com/foo/bar
domain.com/foo/bar/foo
domain.com/foo/bar/foo/bar

だがしかし

domain.com/foo/
domain.com/foo/bar/foo/bar/foo

を使用すると、process_valueこのような機能が機能します

def filter_path(value):
    # at least 2, at most 3 /'s
    if 1 < value.count('/') < 4:
        return value

上記の関数は、html リンク/foo/foo/bar/foo、 などの href の値があることを前提としています。

特定のケースでは、正規表現は のようdomain.com/static/(?:\w+/){3}otherstuffになり、関数はサフィックスfilter_pathをチェックする場合があります。value.startswith('/static/')

Ruleでクラスを使用している場合は、3 番目のオプションがありますCrawlSpider。パラメータを使用すると、process_linksリンク リストを処理する関数を渡すことができます。例えば

def url_allowed(url):
    # check for the pattern /static/dir/dir/dir/ etc
    return True

def process_links(links):
    return [l for l in links if url_allowed(l.url)]
于 2013-10-22T00:51:24.853 に答える