Adblock Plus规则解析器
项目描述
adblockparser
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 过滤语法,请查看以下链接
获取过滤规则:手动编写,从 EasyList 下载的文件中读取行等。
>>> raw_rules = [ ... "||ads.example.com^", ... "@@||ads.example.com/notbanner^$~script", ... ]
从规则字符串创建 AdblockRules 实例
>>> from adblockparser import AdblockRules >>> rules = AdblockRules(raw_rules)
使用此实例检查 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’ 选项(具有 True 或 False 值),则涉及 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)
添加了对正则表达式规则的支持(感谢 https://github.com/mlyko)。
0.5 (2016-03-04)
修复了过滤器文件中空白行的问题(感谢 https://github.com/skrypka);
修复了当域名没有点时应用带有“domain”选项的规则的问题(例如“localhost”);
删除了对 Python 2.6 和 Python 3.2 的支持;adblockparser 在这些解释器中可能仍然可以工作,但不再通过测试进行验证。
0.4 (2015-03-29)
AdblockRule 现在缓存编译后的正则表达式(感谢 https://github.com/mozbugbox);
修复了对“domain”选项的处理问题(感谢 https://github.com/nbraem 提供的漏洞报告和测试用例);
清理和测试改进。
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 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 7a3407ddc31a29e42732bbcb04f3677c6959bffa1ea9d712afd498e0b4d09b22 |
|
MD5 | e40e721bcb7a82a2c85794667eec0f01 |
|
BLAKE2b-256 | d36576ede5435428f1ffb62092b0d2ced1a94d2084e2777337754767d88feb51 |