1

rel="nofollow"パラメータを使用してすべての外部URLを閉じようとしています。

私はこの単純なミドルウェアを書きます:

import re

NOFOLLOW_RE = re.compile(u'<a (?![^>]*rel=["\']nofollow[\'"])'\
                         u'(?![^>]*href=["\']mysite\.com[\'"])',
                         re.UNICODE|re.IGNORECASE)

class NofollowLinkMiddleware(object):

    def process_response(self, request, response):
        if ("text" in response['Content-Type']):

            response.content = re.sub(NOFOLLOW_RE, u'<a rel="nofollow" ', response.content.decode('UTF8') )
            return response
        else:
            return response

動作しますが、内部および外部のすべてのリンクを閉じます。そして、リンクに<noindex></noindex>タグを追加する方法がわかりません。

4

2 に答える 2

3

最初は、「http://」とURLパスを忘れていました。したがって、正規表現は次のようになります。

NOFOLLOW_RE = re.compile(u'<a (?![^>]*rel=["\']nofollow[\'"])'\
                         u'(?![^>]*href=["\']http://mysite\.com(/[^\'"]*)?[\'"])',
                         re.U|re.I)

次に、「/」と「#」で始まるhrefを内部リンクとして考慮する必要もあります。

NOFOLLOW_RE = re.compile(u'<a (?![^>]*rel=["\']nofollow[\'"])'\
                         u'(?![^>]*href=["\'](?:https?://mysite\.com(?:/[^\'"]*)|/[^\'"]*|#[^\'"]*)[\'"])',
                         re.U|re.I)

また、第3レベルドメインと「https://」プロトコルを考慮に入れることもできます。

グループを使用できる<noindex>タグについては、Pythonドキュメントのre.sub()を参照してください。

NOFOLLOW_RE = re.compile(u'<a (?P<link>(?![^>]*rel=["\']nofollow[\'"])'\
                         u'(?![^>]*href=["\'](?:https?://mysite\.com(?:/[^\'"]*)|/[^\'"]*|#[^\'"]*)[\'"]).*?</a>)',
                         re.U|re.I)
...
response.content = NOFOLLOW_RE.sub(u'<noindex><a rel="nofollow" \g<link></noindex>', your_html)

この正規表現は風変わりです。<a>タグと想像できる属性のすべての可能な組み合わせを使用して、テストを作成することを強くお勧めします。後でこのコードに問題が見つかった場合、テストはすべてを壊さないようにするのに役立ちます。

于 2012-07-19T15:24:24.403 に答える
1

私は非常に遅いことを知っていますが、私は他の人に答えを残しています。@HighCatは、1つを除くすべてのケースに正しい答えを出しました。上記の正規表現は、リンクhttp://example.comにもnofollowを追加します

したがって、この場合の正規表現は=>である必要があります

import re

NOFOLLOW_RE = re.compile(u'<a (?P<link>(?![^>]*rel=["\']nofollow[\'"])'\
                         u'(?![^>]*href=["\'](?:https?://example\.com/?(?:[^\'"]*)|/[^\'"]*|#[^\'"]*)[\'"]).*?</a>)',
                         re.U|re.I)

class NofollowLinkMiddleware(object):

    def process_response(self, request, response):
        if ("text" in response['Content-Type']):

            response.content = NOFOLLOW_RE.sub(u'<a rel="nofollow" target="_blank" \g<link>', response.content.decode('UTF8') )
            return response
        else:
            return response

マイナーチェンジです。コメントまたは編集する必要がありますが、(コメントに対して)十分な評判がなく、編集には6文字以上の変更も必要です。

于 2015-10-25T21:38:11.273 に答える