python - 用于为所有外部链接添加 relnofollow 的 Django 中间件

标签 python django nofollow

我正在尝试使用 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

它有效,但会关闭所有内部和外部链接。而且我不知道如何添加 标签链接。

最佳答案

起初,您忘记了“http://”和 url 路径。所以,你的正则表达式应该是:

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

然后,你还需要考虑以“/”和“#”开头的hrefs作为内部链接:

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

此外,您可能希望考虑第 3 级域和“https://”协议(protocol)。

对于 标签,您可以使用组,查看 re.sub() in Python docs :

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)

这个正则表达式很古怪。我强烈建议您为它编写一个测试,使用 标签的所有可能组合以及您可以想象的属性。如果您之后在这段代码中发现了一些问题,测试将帮助您不要破坏所有内容。

关于python - 用于为所有外部链接添加 relnofollow 的 Django 中间件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11562701/

相关文章:

python - 如何从 Dataframe 中检索具有最近日期的数据?

python - Celery 工作人员在 Matplotlib subplot() 期间过早退出

Django URL 和 include() - 如何区分 2 个独立应用程序中具有相同 "name"的 2 个 url?

wordpress - 指向停放域的内部链接 + SEO

python - 从此表中获取数据 html python

python - 对动态框架中的数据进行透视/分组

python - 在 Django Web 应用程序中运行异步 Python 代码

wordpress - 子目录中整个 Wordpress 安装的 noindex、nofollow?

html - 多个 rel 属性

python - 如何遍历实例对象的数据属性,一次返回两个值?