跳转到主要内容

Adblock Plus规则解析器

项目描述

adblockparser

PyPI Version License Build Status Code Coverage

adblockparser 是一个用于处理 Adblock Plus 过滤规则的软件包。它可以解析 Adblock Plus 过滤规则并匹配 URL。

安装

pip install adblockparser

支持 Python 2.7 和 Python 3.3+。

如果您计划使用此库处理大量过滤器,强烈推荐安装 pyre2 库:默认 EasyList 过滤器列表的速度提升可以超过 1000 倍。

pip install ‘re2 >= 0.2.21’

请注意,pyre2 库需要安装 C++ re2 库。在 OS X 上,您可以使用 homebrew 安装它(brew install re2)。

使用方法

要了解 Adblock Plus 过滤语法,请查看以下链接

  1. 获取过滤规则:手动编写,从 EasyList 下载的文件中读取行等。

    >>> raw_rules = [
    ...     "||ads.example.com^",
    ...     "@@||ads.example.com/notbanner^$~script",
    ... ]
  2. 从规则字符串创建 AdblockRules 实例

    >>> from adblockparser import AdblockRules
    >>> rules = AdblockRules(raw_rules)
  3. 使用此实例检查 URL 是否应该被阻止

    >>> rules.should_block("http://ads.example.com")
    True

    带有选项的规则在未传递选项值的字典时将被忽略

    >>> rules.should_block("http://ads.example.com/notbanner")
    True
    >>> rules.should_block("http://ads.example.com/notbanner", {'script': False})
    False
    >>> rules.should_block("http://ads.example.com/notbanner", {'script': True})
    True

有关选项的描述,请咨询 Adblock Plus 文档。这些选项允许编写依赖于外部信息的过滤器,而这些信息本身并不在 URL 中。

性能

正则表达式引擎

AdblockRules 类创建了一个巨大的正则表达式来匹配不使用选项的过滤规则。与 stdlib 的 re 相比,pyre2 库在这些正则表达式上表现更好。如果您已安装 pyre2,那么 AdblockRules 应该运行得更快,并且速度提升可以非常显著——在某些情况下超过 1000 倍。

有时 pyre2 会向 stderr 打印类似 re2/dfa.cc:459: DFA out of memory: prog size 270515 mem 1713850 的信息。给 re2 库更多内存以修复此问题

>>> rules = AdblockRules(raw_rules, use_re2=True, max_mem=512*1024*1024)  # doctest: +SKIP

确保您使用的是从 PyPI 安装的 re2 0.2.20,因为它不起作用。

解析带有选项的规则

目前,带有选项的规则在循环中逐个匹配。同时,它们会检查与用户传递的选项的兼容性:例如,如果用户没有传递 ‘script’ 选项(具有 TrueFalse 值),则涉及 script 的所有规则都将被丢弃。

如果您有数千条此类规则,这将很慢。为了使它更快地运行,请在 AdblockRules 构造函数中显式列出您想要支持的所有选项,禁用跳过不受支持的规则,并始终传递包含所有选项的字典到 should_block 方法

>>> rules = AdblockRules(
...    raw_rules,
...    supported_options=['script', 'domain'],
...    skip_unsupported_rules=False
... )
>>> options = {'script': False, 'domain': 'www.mystartpage.com'}
>>> rules.should_block("http://ads.example.com/notbanner", options)
False

这样,带有不受支持的选项的规则将在创建 AdblockRules 实例时过滤一次。

限制

当前实现有一些已知的限制

  • 元素隐藏规则被忽略;

  • 匹配大量过滤器对 URL 可以较慢,特别是如果没有安装 pyre2 并且启用了许多过滤选项;

  • match-case 过滤选项没有得到适当支持(它被忽略);

  • document 过滤选项没有得到适当支持;

  • 在解析之前不会验证规则,因此无效的规则可能会引发不一致的异常或默默地工作不正确。

可以移除所有这些限制。如果您想尽快实现这一点,欢迎提交拉取请求!

贡献

为了运行测试,安装 tox 并输入

tox

从源代码检出。

许可证是 MIT。

更改

0.7 (2016-10-17)

  • 修复了与 recent easylist.txt 相关的解析问题;

  • 修复了对 easylist 的链接(感谢 https://github.com/limonte)。

0.6 (2016-09-10)

0.5 (2016-03-04)

  • 修复了过滤器文件中空白行的问题(感谢 https://github.com/skrypka);

  • 修复了当域名没有点时应用带有“domain”选项的规则的问题(例如“localhost”);

  • 删除了对 Python 2.6 和 Python 3.2 的支持;adblockparser 在这些解释器中可能仍然可以工作,但不再通过测试进行验证。

0.4 (2015-03-29)

0.3 (2014-07-11)

  • 切换到 setuptools;

  • 为 AdblockRule 提供了更好的 __repr__

  • 确认支持 Python 3.4;

  • 测试改进。

0.2 (2014-03-20)

此版本提供了更快的 AdblockRules.should_block() 方法,用于没有选项和带有“domain”选项的规则。

  • 为无选项的规则提供了更好的组合正则表达式,使得 re2 库始终使用 DFA 而不回退到 NFA;

  • 为带有域名的规则提供了索引;

  • params 方法参数重命名为 options 以保持一致性。

0.1.1 (2014-03-11)

默认情况下,AdblockRules 自动检测 re2 库并在检测到兼容版本时使用它。

0.1 (2014-03-03)

初始发布。

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪个,请了解更多关于 安装软件包 的信息。

源代码分发

adblockparser-0.7.tar.gz (12.9 kB 查看哈希值)

上传时间 源代码

构建分发

adblockparser-0.7-py2.py3-none-any.whl (13.3 kB 查看哈希值)

上传时间 Python 2 Python 3

支持