36 lines
1.1 KiB
Python
36 lines
1.1 KiB
Python
from importlib import import_module
|
|
|
|
from django.utils import six
|
|
from django.utils.functional import LazyObject
|
|
|
|
# support legacy parser module usage
|
|
from compressor.parser.base import ParserBase # noqa
|
|
from compressor.parser.lxml import LxmlParser
|
|
from compressor.parser.default_htmlparser import DefaultHtmlParser as HtmlParser
|
|
from compressor.parser.beautifulsoup import BeautifulSoupParser # noqa
|
|
from compressor.parser.html5lib import Html5LibParser # noqa
|
|
|
|
|
|
class AutoSelectParser(LazyObject):
|
|
options = (
|
|
# TODO: make lxml.html parser first again
|
|
(six.moves.html_parser.__name__, HtmlParser), # fast and part of the Python stdlib
|
|
('lxml.html', LxmlParser), # lxml, extremely fast
|
|
)
|
|
|
|
def __init__(self, content):
|
|
self._wrapped = None
|
|
self._setup(content)
|
|
|
|
def __getattr__(self, name):
|
|
return getattr(self._wrapped, name)
|
|
|
|
def _setup(self, content):
|
|
for dependency, parser in self.options:
|
|
try:
|
|
import_module(dependency)
|
|
self._wrapped = parser(content)
|
|
break
|
|
except (ImportError, TypeError):
|
|
continue
|