Skip to main content

Parser for Adblock Plus rules

Project description

adblockparser

https://secure.travis-ci.org/scrapinghub/adblockparser.png?branch=master

adblockparser is a package for working with Adblock Plus filter rules. It can parse Adblock Plus filters and match URLs against them.

Installation

pip install adblockparser

If you plan to use this library with a large number of filters installing pyre2 library is highly recommended: the speedup for a list of default EasyList filters can be greater than 1000x. Version from github is required:

pip install git+https://github.com/axiak/pyre2.git#egg=re2

Usage

To learn about Adblock Plus filter syntax check these links:

  1. Get filter rules somewhere: write them manually, read lines from a file downloaded from EasyList, etc.:

    >>> raw_rules = [
    ...     "||ads.example.com^",
    ...     "@@||ads.example.com/notbanner^$~script",
    ... ]
  2. Create AdblockRules instance from rule strings:

    >>> from adblockparser import AdblockRules
    >>> rules = AdblockRules(raw_rules)
  3. Use this instance to check if an URL should be blocked or not:

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

    Rules with options are ignored unless you pass a dict with options values:

    >>> 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

Consult with Adblock Plus docs for options description. These options allow to write filters that depend on some external information not available in URL itself.

Performance

Regex engines

AdblockRules class creates a huge regex to match filters that don’t use options. pyre2 library works better than stdlib’s re with such regexes. If you have pyre2 installed then AdblockRules should work faster, and the speedup can be dramatic - more than 1000x in some cases.

Sometimes pyre2 prints something like re2/dfa.cc:459: DFA out of memory: prog size 270515 mem 1713850 to stderr. Give re2 library more memory to fix that:

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

Make sure you are not using re2 0.2.20 installed from PyPI, it doesn’t work. Install it from the github repo.

Parsing rules with options

Rules that have options are currently matched in a loop, one-by-one. Also, they are checked for compatibility with options passed by user: for example, if user didn’t pass ‘script’ option (with a True or False value), all rules involving script are discarded.

This is slow if you have thousands of such rules. To make it work faster, explicitly list all options you want to support in AdblockRules constructor, disable skipping of unsupported rules, and always pass a dict with all options to should_block method:

>>> 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

This way rules with unsupported options will be filtered once, when AdblockRules instance is created.

Limitations

There are some known limitations of the current implementation:

  • element hiding rules are ignored;

  • matching URLs against a large number of filters can be slow-ish, especially if pyre2 is not installed and many filter options are enabled;

  • match-case filter option is not properly supported (it is ignored);

  • document filter option is not properly supported;

  • rules are not validated before parsing, so invalid rules may raise inconsistent exceptions or silently work incorrectly;

  • regular expressions in rules are not supported.

It is possible to remove all these limitations. Pull requests are welcome if you want to make it happen sooner!

Contributing

In order to run tests, install tox and type

tox

from the source checkout.

The license is MIT.

Changes

0.3 (2014-07-11)

  • Switch to setuptools;

  • better __repr__ for AdblockRule;

  • Python 3.4 support is confirmed;

  • testing improvements.

0.2 (2014-03-20)

This release provides much faster AdblockRules.should_block() method for rules without options and rules with ‘domain’ option.

  • better combined regex for option-less rules that makes re2 library always use DFA without falling back to NFA;

  • an index for rules with domains;

  • params method arguments are renamed to options for consistency.

0.1.1 (2014-03-11)

By default AdblockRules autodetects re2 library and uses it if a compatible version is detected.

0.1 (2014-03-03)

Initial release.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

adblockparser-0.3.tar.gz (11.5 kB view details)

Uploaded Source

Built Distribution

adblockparser-0.3-py2.py3-none-any.whl (11.7 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file adblockparser-0.3.tar.gz.

File metadata

  • Download URL: adblockparser-0.3.tar.gz
  • Upload date:
  • Size: 11.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for adblockparser-0.3.tar.gz
Algorithm Hash digest
SHA256 fb64ad236af49cd7a50832e864c9d9bd471568a6758704a7fefad68806e66149
MD5 733a92104029777301b7b89592524629
BLAKE2b-256 5ded185ce924ffdbec8e03f67e95cbabecfd7e1a615ccf76aebef5bb40a989c7

See more details on using hashes here.

Provenance

File details

Details for the file adblockparser-0.3-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for adblockparser-0.3-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 b63712134954c8f8b6d8dd6c812d2d93f12f418050009376191154a274a7b693
MD5 a07ffaf5cb282f13a2e3f9b7f7b764e0
BLAKE2b-256 64f8b9a667e590b8a185ac962a486668f34637cdc0290faacf67b769a7b7f816

See more details on using hashes here.

Provenance

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page